c# .net 4.5 async await Task.Wait()阻塞问题

本文关键字:问题 Wait Task net async await | 更新日期: 2023-09-27 17:50:59

我有以下扩展方法:

internal static string ReadLine(this DataReader stream)
{
   Task<string> line = ReadLineAsync(stream);
   // line.Wait(); - Not Required, as next call blocks
   return line.Result;
}

它基本上是返回字符串的异步方法调用的同步方法调用包装。如果我逐行执行,代码可以正常工作,但是如果我让它自由执行,我就会遇到一个不确定的块。什么好主意吗?

与之前我发布的问题相关:我如何更新我的API以使用async关键字而不使用await为所有调用者

c# .net 4.5 async await Task.Wait()阻塞问题

正如一些人对你的另一个问题的回答所评论的那样,如果你在GUI应用程序中使用Task.Result,你可能会导致死锁(正如我在我的博客上详细解释的那样)。

简而言之:

  • 在UI线程上启动异步操作。请注意,任务line代表ReadLineAsync方法,并在该方法完成时完成。
  • ReadLineAsync调用await进行一些未完成的操作。这会导致ReadLineAsync返回一个未完成的任务(line)。
  • 阻塞UI线程,等待line完成。
  • await ed操作完成后,它将ReadLineAsync的剩余部分调度给UI线程。
  • UI线程无法完成ReadLineAsync,因为它被同步阻塞等待ReadLineAsync完成。僵局。

看看我对你的另一个问题的回答,以找到解决这个僵局的方法。简而言之:

    使用ConfigureAwait(false)
  • 改变你的错误处理,以说明ResultAggregateException中包装它的错误。

根据:http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx你不应该在做:

internal static string ReadLine(this DataReader stream)
{
   string line = await ReadLineAsync(stream);
   return line
}

也就是说,我还没有开始这个Async业务。但是我读过文档等等