1

System.Json我正在从 NuGet试用(Beta 版)。此外,为了了解这些新事物asyncawait刚刚开始使用 Visual Studio 2012 进行修补。

想知道是否使用ContinueWithifawait块直到整个事情完成?

例如,这是不是:

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

?

4

1 回答 1

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返回 by ContinueWith,并且在继续完成json之前不会对变量进行赋值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/ awaitintro很有帮助。

于 2012-10-19T18:23:21.863 回答