为什么我必须等待继续

本文关键字:等待 继续 为什么 | 更新日期: 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);
}