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应用程序中使用,你可能会导致死锁(正如我在我的博客中详细解释的那样).
简而言之:
line
表示该ReadLineAsync
方法,并将在该方法完成时完成.ReadLineAsync
调用await
一些不完整的操作.这导致ReadLineAsync
返回不完整的任务(line
).line
完成的UI线程.await
ed操作完成时,它会调度ReadLineAsync
UI线程的剩余部分.ReadLineAsync
因为它被同步阻止等待ReadLineAsync
完成.僵局.看看我对你的另一个问题的回答,以解决这个僵局.简而言之:
ConfigureAwait(false)
到处使用.Result
其错误的帐户AggregateException
. 归档时间: |
|
查看次数: |
7317 次 |
最近记录: |