我有一个调用Web服务的小型MVC 5应用程序,并收到JSON响应。我将响应反序列化为我自己的类型,它被传递给视图,数据由razor显示。
控制器处理程序:
public async Task<ActionResult> Search(string q)
{
var vm = new SearchResultViewModel(await _searchService.GetDataAsync(q));
return View(vm);
}
搜索服务方法:
public async Task<ISearchResult> GetDataAsync(string q)
{
var fullRequest = new UriBuilder(RequestUri) {Query = "q=" + q};
var result = await _client.GetAsync(fullRequest.ToString()).ConfigureAwait(false);
if (result.IsSuccessStatusCode)
{
var jsonResponse = await result.Content.ReadAsStringAsync().ConfigureAwait(false);
// How should I call this?
return JsonConvert.DeserializeObject<SearchResult>(jsonResponse);
}
return new SearchResult
}
我的问题:我该如何致电JsonConvert.DeserializeObject
?这是一个固有的CPU绑定操作,所以可以同步调用(并阻止线程),因为我无法返回,直到它完成了吗?如果反序列化存在问题,则无法使用取消令牌。
如果我应该异步调用,我应该使用intellisense建议的Task.Factory.StartNew()
作为已弃用的JsonConvert.DeserializeObjectAsync()
的替换吗? This频道9视频显示(在58分钟时)这不是一个好主意。也许是另一种选择,例如Task.Run()
?可能是一个坏主意,因为它可能导致SyncContext问题?
任何指针都感激不尽!
答案 0 :(得分:3)
你的代码很好。由于您使用的是DeserializeObject
,因此ConfigureAwait(false)
将在线程池线程内运行。
您的整体方法(GetDataAsync
)仍然是异步的,因为它会在第一个await
返回给调用者。