ASP.NET 中的异步 JSON 反序列化
Async JSON deserialisation in ASP.NET
我有一个小型 MVC 5 应用程序调用 Web 服务,并收到 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 绑定操作,所以同步调用(并阻塞线程)是否可以,因为我不能 return 直到它完成?如果反序列化有问题,则无法使用取消令牌。
如果我应该异步调用,我是否应该按照 intellisense 的建议使用 Task.Factory.StartNew()
来替代已弃用的 JsonConvert.DeserializeObjectAsync()
? This 第 9 频道的视频表明(在 58 分钟时)这不是一个好主意。也许另一种选择,例如 Task.Run()
?可能是个坏主意,因为它可能会导致 SyncContext 问题?
如有指点,不胜感激!
你的代码是好的。 DeserializeObject
将 运行 在线程池线程中,因为您正在使用 ConfigureAwait(false)
.
您的整体方法 (GetDataAsync
) 仍然是异步的,因为它将 return 在第一个 await
.
上发送给调用者
我有一个小型 MVC 5 应用程序调用 Web 服务,并收到 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 绑定操作,所以同步调用(并阻塞线程)是否可以,因为我不能 return 直到它完成?如果反序列化有问题,则无法使用取消令牌。
如果我应该异步调用,我是否应该按照 intellisense 的建议使用 Task.Factory.StartNew()
来替代已弃用的 JsonConvert.DeserializeObjectAsync()
? This 第 9 频道的视频表明(在 58 分钟时)这不是一个好主意。也许另一种选择,例如 Task.Run()
?可能是个坏主意,因为它可能会导致 SyncContext 问题?
如有指点,不胜感激!
你的代码是好的。 DeserializeObject
将 运行 在线程池线程中,因为您正在使用 ConfigureAwait(false)
.
您的整体方法 (GetDataAsync
) 仍然是异步的,因为它将 return 在第一个 await
.