等待和继续

时间:2012-10-19 17:30:19

标签: visual-studio-2012 .net-4.5

我正在尝试从NuGet System.Json(Beta)。此外,尝试了解这个新的async / await内容,刚开始使用Visual Studio 2012进行修补。

想知道如果ContinueWith阻止整个事情完成之前是否使用await

,例如:

JsonValue json = await response.Content.ReadAsStringAsync().ContinueWith<JsonValue>(respTask => JsonValue.Parse(respTask.Result));

与:

相同
        string respTask = await response.Content.ReadAsStringAsync();
        JsonValue json = await Task.Factory.StartNew<JsonValue>(() => JsonValue.Parse(respTask));

1 个答案:

答案 0 :(得分:3)

这些相似但不完全相同。

ContinueWith返回表示延续的Task。那么,举个例子:

JsonValue json = await response.Content.ReadAsStringAsync()
    .ContinueWith<JsonValue>(respTask => JsonValue.Parse(respTask.Result));

只考虑表达式:

                       response.Content.ReadAsStringAsync()
    .ContinueWith<JsonValue>(respTask => JsonValue.Parse(respTask.Result));

此表达式的结果是Task,代表ContinueWith计划的续约。

所以,当你await表达时:

                 await response.Content.ReadAsStringAsync()
    .ContinueWith<JsonValue>(respTask => JsonValue.Parse(respTask.Result));

您确实await Task返回的ContinueWithjson变量的分配将不会发生,直到ContinueWith延续完成:

JsonValue json = await response.Content.ReadAsStringAsync()
    .ContinueWith<JsonValue>(respTask => JsonValue.Parse(respTask.Result));

一般来说,我在撰写ContinueWith代码时会避免async。它没有错误,但它有点低级,语法更尴尬。

在你的情况下,我会做这样的事情:

var responseValue = await response.Content.ReadAsStringAsync();
var json = JsonValue.Parse(responseValue);

如果这是数据访问层的一部分,我也会使用ConfigureAwait(false),但由于您直接访问response.Content我假设您稍后需要在此方法中使用ASP.NET上下文

由于您是async / await的新用户,因此我可能会发现async / await intro有帮助。