在异步/等待中
僵局:一个实践的例子
c#'s async
/await
简化异步编程,改善代码可读性。 但是,忽视同步环境可能会导致死锁。本文研究了一个常见的僵局场景并提供解决方案。
了解僵局问题
在异步编程中,常见的陷阱涉及单线读取的非伦敦同步上下文中的死锁,例如Windows UI线程或ASP.NET请求上下文。考虑此代码:
<code class="language-csharp">public ActionResult ActionAsync() { // DEADLOCK: Blocking on the async task var data = GetDataAsync().Result; return View(data); } private async Task<string> GetDataAsync() { // Simple async method var result = await MyWebService.GetDataAsync(); return result.ToString(); }</code>僵局分析
主线程启动
,并使用立即阻止,等待完成。 GetDataAsync()
>的背景任务尝试执行。 由于同步上下文是单线读取的,因此主线程保持上下文,阻止了背景任务继续。
.Result
>的延续被阻止,直到上下文线程释放(通过主线程),而主线程停滞不前,等待GetDataAsync()
GetDataAsync()
解决方案:防止僵局GetDataAsync()
遵循以下准则以防止死锁:
>策略性异步/等待使用:
async
await
>以上是在C#中使用异步/等待时,如何避免僵局?的详细内容。更多信息请关注PHP中文网其他相关文章!