在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
結束,從而導致永久僵局。
>>>>>中捕獲的,因此它取決於主線程的完成。 由於主線程被阻塞,因此此依賴性阻止await
單線程上下文的解決方案是避免在GetDataAsync
>方法中阻止操作。 使用非阻滯技術(例如輪詢或回調)進行同步。 而不是GetDataAsync
,在
來解決此特定示例。
以上是在C#'s's's'/`等待中如何發生異步僵局,如何避免它們?的詳細內容。更多資訊請關注PHP中文網其他相關文章!