async
和await
僵局:解决方案HttpClient.GetAsync(...)
>
在ASP.NET >使用HttpClient.GetAsync(...)
方法可以导致死锁。之所以发生这种情况,是因为ASP.NET的单线程请求处理模型与async
的异步性质发生冲突。 当HttpClient
暂停执行时,该线程将释放,但是恢复任务可能会尝试重新重新考虑已被另一个请求占用的同一线程,从而导致停滞。await
返回不完整的
httpClient.GetAsync
>Task
悬挂当前线程直到await
>尝试在ASP.NET请求上下文中恢复,但是上下文已经在使用中。
Task
僵局结果。Task
:
ConfigureAwait(false)
>避免阻塞:Task
始终使用
上同步阻塞,直接导致死锁。await
GetResult()
代码示例:Task
>校正的代码:
<code class="language-csharp">public async Task<string> GetSomeDataAsync() { var httpClient = new HttpClient(); var result = await httpClient.GetAsync("http://stackoverflow.com", HttpCompletionOption.ResponseHeadersRead); return result.Content.Headers.ToString(); }</code>
>更深入地了解.NET中的异步编程以及如何避免僵局,请参阅以下资源:>
以上是为什么在 ASP.NET 中使用 `await`/`async` 时 `HttpClient.GetAsync(...)` 挂起?的详细内容。更多信息请关注PHP中文网其他相关文章!