我有以下扩展方法:
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
中的问题。