在我的 Xamarin.Forms 應用程式中,我的代碼可以打開一個彈出頁面(使用 Rg Popups 插件),該頁面執行對我的 API 的呼叫,該 API 在資料庫中插入一些資料。我需要打開彈出視窗的異步呼叫以等待彈出頁面的任務完成,然后執行另一個異步呼叫來更新當前視圖中的 ListView。
但是,彈出視窗的異步任務不會等到彈出視窗完成作業才能繼續執行下一個任務,這意味著視圖不會更新
這是有問題的代碼:
bool jobTask = await CloseCurOpenJob();
if (jobTask == true)
{
await FillDocuments();
}
await Navigation.PushPopupAsync(new JobClosePopupPage(Base.activeJobId));
return true;
private async Task<string> FillDocuments()
{
HttpClient client = new HttpClient();
try
{
if (jobid > 0)
{
var response = await client.GetStringAsync(myApiUri);
var DocumentsList = JsonConvert.DeserializeObject<List<DocumentHeader>>(response);
Documents = new ObservableCollection<DocumentHeader>((IEnumerable<DocumentHeader>)DocumentsList);
DocumentCount = Documents.Count();
DocumentSubtotal = Documents.Sum(instance => instance.TotalQuantity);
}
return "OK";
}
catch (Exception e)
{
return e.Message;
}
}
這是彈出頁面的 ViewModel 中的代碼
private async Task<bool> CloseJob(int jobid)
{
HttpClient client = new HttpClient();
try
{
var response = await client.PostAsync(myAPIUri);
string responseString = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode)
{
await CheckGetOpenJob();
return true;
}
else
{
await Application.Current.MainPage.DisplayAlert(Base.applicationTitle, responseString, "OK");
return false;
}
}
catch (Exception e)
{
await Application.Current.MainPage.DisplayAlert(Base.applicationTitle, e.Message, "OK");
return false;
}
finally
{
await Navigation.PopPopupAsync();
}
}
我嘗試使用 Task.Run 和 Task.Delay 但結果仍然相同 - FillDocuments 方法在彈出視窗顯示后運行,而不是在它被關閉后運行。
uj5u.com熱心網友回復:
Task.Wait()andTask.Result將使程式等待異步任務方法完成。
如果CloseCurOpenJob()是這樣public async Task<bool> CloseCurOpenJob(){}你可以試試下面的代碼:
// Both are applicable to simple Tasks:
bool jobTask = CloseCurOpenJob().Result;
或者
Task<bool> result = CloseCurOpenJob();
result.Wait();
bool jobTask = result.Result;
根據您的描述,您希望在彈出視窗顯示時更新它。但是您說使用 .Wait() 方法時不會顯示彈出視窗。
一般來說,它不應該發生。但是您可以嘗試使用 Thread.Sleep() 例如:
bool jobTask = await CloseCurOpenJob();
Thread.Sleep(1000); //make the thread to wait for 1s and the async task usually completes in 1s
if (jobTask == true)
{
await FillDocuments();
}
但是這種方式似乎不太優雅,您可以發布有關該CloseCurOpenJob()方法的代碼。另外,如果CloseCurOpenJob()是public async bool CloseCurOpenJob(),你可以讓執行緒在沒有等待的情況下等待。如
bool jobTask = CloseCurOpenJob();
uj5u.com熱心網友回復:
我想分享一些我發現的東西:
問題不在于代碼,而在于它的流程。也就是說,當另一個頁面正在作業時,我需要一個頁面來關閉彈出視窗。
我想我找到的解決方案 - 它尚未經過測驗 - 如下:
顯示彈出視窗 在顯示彈出視窗后在主頁面的執行緒中進行處理 - 因為它是異步的,所以代碼將繼續執行任務。關閉主頁代碼中的彈出視窗(使用 Rg 插件的 PopAllPopup 方法)。
所以...
bool jobTask = await CloseCurOpenJob();
if (jobTask == true)
{
await FillDocuments();
}
會成為
await Navigation.PushPopupAsync(new JobClosePopupPage(Base.activeJobId));
bool jobTask = MethodThatProcessesTheData().Result;
await Navigation.PopAllPopupAsync();
我想這就是它應該去的方式......
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/459760.html
