c#.net 4.5异步等待Task.Wait()阻塞问题

c0D*_*g1c 3 .net c# deadlock async-await .net-4.5

我有以下扩展方法:

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

它基本上是一个异步方法调用的同步方法调用包装器,它返回一个字符串.如果我逐行遍历它,代码工作正常,但似乎如果我让它自由执行,我会遇到一个无限期的块.有任何想法吗?

与上一个问题相关,我发布了:如何更新我的API以使用async关键字而不使用等待所有调用者

Ste*_*ary 10

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

简而言之:

  • 您在UI线程上启动异步操作.请注意,该任务line表示该ReadLineAsync方法,并将在该方法完成时完成.
  • ReadLineAsync调用await一些不完整的操作.这导致ReadLineAsync返回不完整的任务(line).
  • 您阻止等待line完成的UI线程.
  • awaited操作完成时,它会调度ReadLineAsyncUI线程的剩余部分.
  • UI线程无法完成,ReadLineAsync因为它被同步阻止等待ReadLineAsync完成.僵局.

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

  • ConfigureAwait(false)到处使用.
  • 将错误处理更改为包含Result其错误的帐户AggregateException.