我試圖從 View 中的另一個方法呼叫 ViewModel 的異步方法,但它的行為是同步的。
查看型號:
public async Task<bool> GetReadyForUnlockWithQR()
{
try
{
SmilaHash = GetRandomeHashKey();
var data = JsonConvert.SerializeObject(GetSmilaInfo());
var res = await apiClient.PostAsync<String>("readyforunlockwithqr", data);
if (res != null)
{
JObject json = JObject.Parse(res);
if (json["doUnlock"] != null)
{
LoginStatus = json.SelectToken("doUnlock").Value<bool>();
}
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
CancelPendingRequests();
throw ex;
}
return false;
}
我在自定義 APIClient 檔案中定義了我的 api 方法。上述請求可能需要一分鐘才能完成。我不想停止 UI 并在 View 中執行我的進一步操作。以下是我的看法:
private async void UnlockButton_Click(object sender, RoutedEventArgs e)
{
try
{
await ViewModel.GetReadyForUnlockWithQR();
DisplayQRCode();
}
catch(Exception ex)
{
if (ex is HttpRequestException)
{
Debug.WriteLine("Server not reachable");
MessageBox.Show("Server not reachable");
}
else if (ex is OperationCanceledException)
{
Debug.WriteLine("Timeout exception");
QRCodeImage.Source = null;
QRCodeCanvas.Visibility = Visibility.Hidden;
}
else
{
Debug.WriteLine(ex.Message);
}
}
}
我上面的代碼理想情況下 DisplayQRCode() 函式應該在 await ViewModel.GetReadyForUnlockWithQR(); 之后立即作業。但它沒有發生。DisplayQRCode() 正在等待接收來自 ViewModel.GetReadyForUnlockWithQR() 的回應 為什么這不是邏輯異步代碼。
uj5u.com熱心網友回復:
DisplayQRCode() 正在等待接收來自 ViewModel.GetReadyForUnlockWithQR() 的回應 為什么這不是邏輯異步代碼。
異步方法的行為是串行的(不是“同步的”),這正是應該做的await。
您可以將其await視為“異步等待”:該方法被暫停并且在任務完成之前不會繼續傳遞await,但它異步等待,因此執行緒被釋放(該方法回傳給它的呼叫者)。
我上面的代碼理想情況下 DisplayQRCode() 函式應該在 await ViewModel.GetReadyForUnlockWithQR(); 之后立即作業。但它沒有發生。
如果您想這樣做,那么您可以呼叫GetReadyForUnlockWithQR但在完成之前不要 await執行任務DisplayQRCode:
var getReadyTask = ViewModel.GetReadyForUnlockWithQR();
DisplayQRCode();
await getReadyTask;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/436203.html
