在异步/等待(C#)
中理解僵局 在单线读取上下文(例如UI线程或ASP.NET请求上下文)中,使用C#'S/async
时,await
僵局是一个常见的问题。 这是由于同步上下文与异步操作相互作用的方式而发生的。
僵局的根
> 当异步方法(例如)同步称为,然后使用GetDataAsync
等待其结果时,就会出现僵局。 这会阻止单个线程。 因为.Result
的延续需要相同的线程(捕获的同步上下文),所以它无法运行,创建僵局。GetDataAsync
解决方案:非阻滞方法
避免这种情况的关键是避免阻塞单线。 而不是同步等待异步操作完成,而是使用非阻滞方法:>在这里,
<code class="language-csharp">public ActionResult ActionAsync() { // NON-BLOCKING ASYNC OPERATION GetDataAsync().ContinueWith(task => { var data = task.Result; // Access result safely here return View(data); }); return View();//or some other non-blocking return }</code>计划执行一次
完成的延续。这可以释放主线程,从而允许在异步操作完成时在同一线程上延续。 这样可以防止僵局。 请注意,可能需要根据特定框架和所需的行为来调整ContinueWith
。 根据上下文,更合适的退货可能是GetDataAsync
>或类似的。
以上是如何在单线程上下文中避免异步/等待僵局?的详细内容。更多信息请关注PHP中文网其他相关文章!