在C#中的异步僵局:同步上下文问题
>c#'s async
/await
简化异步编程,但是对同步上下文的处理不当会导致死锁。 同步上下文可确保代码在正确的线程上运行,但是出于非诱因或单线读取上下文(例如UI线程或ASP.NET请求上下文上下文)出现问题。
<code class="language-csharp">public ActionResult ActionAsync() { var data = GetDataAsync().Result; // Blocking call! return View(data); } private async Task<string> GetDataAsync() { var result = await MyWebService.GetDataAsync(); return result.ToString(); }</code>>在这里等待
时,ActionAsync
会阻止。 GetDataAsync
本身正在等待背景任务。 这会造成僵局:主线程(inGetDataAsync
)被阻止,以防止背景任务完成,从而防止ActionAsync
GetDataAsync
结束,从而导致永久僵局。
> in await
中捕获的,因此它取决于主线程的完成。 由于主线程被阻塞,因此此依赖性阻止GetDataAsync
单线程上下文的解决方案是避免在GetDataAsync
>方法中阻止操作。 使用非阻滞技术(例如轮询或回调)进行同步。 而不是
中使用async
来解决此特定示例。
以上是在C#'s's's'/`等待中如何发生异步僵局,如何避免它们?的详细内容。更多信息请关注PHP中文网其他相关文章!