gpt4 book ai didi

c# - ASP.NET 中的异步 JSON 反序列化

转载 作者:太空宇宙 更新时间:2023-11-03 23:19:20 29 4
gpt4 key购买 nike

我有一个小型 MVC 5 应用程序,它调用 Web 服务并接收 JSON 响应。我将响应反序列化为我自己的类型,它被传递到 View ,数据由 razor 显示。

Controller 处理程序:

    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 绑定(bind)操作,所以同步调用(并阻塞线程)是否可以,因为我无法返回,直到它完成为止?如果反序列化出现问题,则无法使用取消 token 。

如果我应该异步调用,我是否应该按照 intellisense 的建议使用 Task.Factory.StartNew() 来替代已弃用的 JsonConvert.DeserializeObjectAsync()This第 9 channel 的视频(58 分钟)表明这不是一个好主意。也许是另一种选择,例如 Task.Run()?可能是个坏主意,因为它可能会导致 SyncContext 问题?

非常感谢收到任何指示!

最佳答案

你的代码是好的。 DeserializeObject 将在线程池线程内运行,因为您正在使用 ConfigureAwait(false)

您的整体方法 (GetDataAsync) 仍然是异步的,因为它将在第一个 await 时返回给调用者。

关于c# - ASP.NET 中的异步 JSON 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35964550/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com