我正在尝试从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));
答案 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
返回的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
/ await
intro有帮助。