[英]call async method without await #2
我有一個異步方法:
public async Task<bool> ValidateRequestAsync(string userName, string password)
{
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync(url);
string stringResponse = await response.Content.ReadAsStringAsync();
return bool.Parse(stringResponse);
}
}
我這樣稱呼這個方法:
bool isValid = await ValidateRequestAsync("user1", "pass1");
我可以在不使用await
關鍵字的情況下從同步方法調用相同的方法嗎?
前任:
public bool ValidateRequest(string userName, string password)
{
return ValidateRequestAsync(userName, password).Result;
}
我認為這會導致僵局。
編輯
調用上面的方法使調用永不結束。 (該方法不再結束)
如果從單線程執行上下文(例如 UI 線程)調用異步方法,並同步等待結果,則死鎖的可能性很高。 在您的示例中,該概率為 100%
想想看。 當你打電話時會發生什么
ValidateRequestAsync(userName, password).Result
您調用方法 ValidateRequestAsync。 在那里你調用 ReadAsStringAsync。 結果是一個任務將被返回到 UI 線程,當它變得可用時,一個延續被安排在 UI 線程上繼續執行。 但當然,它永遠不會變得可用,因為它正在等待(阻塞)任務完成。 但是任務無法完成,因為它正在等待 UI 線程變為可用。 僵局。
有一些方法可以防止這種僵局,但它們都是一個壞主意。 為了完整起見,以下可能有效:
Task.Run(async () => await ValidateRequestAsync(userName, password)).Result;
這是一個壞主意,因為您仍然會阻止 UI 線程等待並且沒有做任何有用的事情。
那么有什么解決辦法呢? 一路異步。 UI 線程上的原始調用者可能是某個事件處理程序,因此請確保它是異步的。
你可以使用return ValidateRequestAsync(userName, password).GetAwaiter().GetResult();
對我來說,它在異步調用中使用 .ConfigureAwait(false) 設置工作。 我有類似的東西
return await Entities.SingleOrDefaultAsync(.....).ConfigureAwait(false);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.