我有以下扩展方法:

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


它基本上是一个异步方法调用包装器,用于返回字符串的异步方法调用。如果我逐行逐步执行代码,则代码运行良好,但是,如果让它自由执行,似乎会遇到不确定的块。有任何想法吗?

与我之前发布的问题相关:How can I update my API to use the async keyword without using await for all callers

最佳答案

正如对其他问题的答案所评论的那样,如果在GUI应用程序中使用Task.Result,则可能会cause a deadlock(正如我在博客中详细解释的那样)。

简而言之:


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


有关解决此死锁的方法,请参见my answer to your other question。简而言之:


随处使用ConfigureAwait(false)
更改您的错误处理以解决Result将其错误包装在AggregateException中的问题。

08-18 04:52