在阅读此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确实等到事先完成任务,然后继续。这里有什么东西我缺少,或者对任务不太了解并继续?
答案 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);
}