为什么我要等待继续

时间:2014-09-28 18:08:59

标签: c# asp.net-mvc asp.net-web-api task

在阅读此question时,接受的答案似乎不正确,如下面的答案和随后的this文章所述。它声明在继续使用日志之前应该等待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
    }   

现在我有点困惑为什么等待确实需要发生,我的理解是continueWith确实等到事先完成任务,然后继续。这里有什么东西我缺少,或者对任务不太了解并继续?

2 个答案:

答案 0 :(得分:2)

需要等待的原因是因为如果你不调用它,那么该方法将立即返回并继续执行。然后,如果模型绑定器尝试在您的第一个呼叫未完成时读取request.Content,则可能会失败。

答案 1 :(得分:0)

我将以上代码编写如下 -

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);
}