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

时间:2016-03-12 23:24:16

标签: c# asp.net async-await json-deserialization

我有一个调用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问题?

任何指针都感激不尽!

1 个答案:

答案 0 :(得分:3)

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

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