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.

上发送给调用者