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为所有调用者
正如一些人对你的另一个问题的回答所评论的那样,如果你在GUI应用程序中使用Task.Result
,你可能会导致死锁(正如我在我的博客上详细解释的那样)。
- 在UI线程上启动异步操作。请注意,任务
line
代表ReadLineAsync
方法,并在该方法完成时完成。 -
ReadLineAsync
调用await
进行一些未完成的操作。这会导致ReadLineAsync
返回一个未完成的任务(line
)。 - 阻塞UI线程,等待
line
完成。 - 当
await
ed操作完成后,它将ReadLineAsync
的剩余部分调度给UI线程。 - UI线程无法完成
ReadLineAsync
,因为它被同步阻塞等待ReadLineAsync
完成。僵局。
看看我对你的另一个问题的回答,以找到解决这个僵局的方法。简而言之:
- 使用
- 改变你的错误处理,以说明
Result
在AggregateException
中包装它的错误。
ConfigureAwait(false)
。根据: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业务。但是我读过文档等等