为什么我必须等待继续
本文关键字:等待 继续 为什么 | 更新日期: 2023-09-27 18:25:01
在阅读这个问题时,接受的答案似乎是不正确的,正如下面的答案和随后的文章所述。它指出,在继续日志之前,您应该等待ReadAsByteArrayAsync完成,因为Model绑定器将返回null,因为它们都在同时读取。
因此,公认的解决方案是:
if (request.Content != null)
{
request.Content.ReadAsByteArrayAsync()
.ContinueWith(task =>
{
var result = Encoding.UTF8.GetString(task.Result);
// Log it somewhere
})
}
但正确的解决方案应该是:
if (request.Content != null)
{
request.Content.ReadAsByteArrayAsync()
.ContinueWith(task =>
{
var result = Encoding.UTF8.GetString(task.Result);
// Log it somewhere
}).Wait(); // Wait until ReadAsByteArrayAsync is completed
}
现在我有点困惑,为什么真的需要等待,我的理解是继续。确实要等到事先的任务完成后再继续。是不是我遗漏了什么,或者对任务不太了解,然后继续?
需要执行Wait的原因是,如果不调用它,那么方法将立即返回并继续执行。然后,如果模型绑定器在您的第一个调用尚未完成时尝试读取request.Content
,它可能会失败。
我会按照以下方式编写上面的代码-
if (request.Content != null)
{
var task = request.Content.ReadAsByteArrayAsync();
// Task.Result waits until Async operation is completed.
// http://msdn.microsoft.com/en-us/library/dd321468(v=vs.110).aspx
var result = Encoding.UTF8.GetString(task.Result);
}