c# - 异步 JSON 反序列化

标签 c# .net json windows-phone-8 asynchronous

我需要执行 RestRequest 并获取一些 JSON,我不确定我的方法是否真的是异步的,因为当我使用此方法时,我的 UI 中仍然有一点卡住。

 public async Task<List<MyObject>> Load() 
            {
                var tcs = new TaskCompletionSource<List<Myobject>>();
                var client = new RestSharp.RestClient("https://exampleapi.com");
                client.Authenticator = OAuth1Authenticator.ForProtectedResource(
           [...]);
                var request = new RestSharp.RestRequest("examp.json", Method.GET);
                client.ExecuteAsync(request, response =>
                {
                    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        List_ = new List<MyObject>();
                        List_ = JsonConvert.DeserializeObject<List<MyObject>>(response.Content);
                        tcs.SetResult(List_);
                    }
                    else
                    {
                        MessageBox.Show("Error");
                    }
                });
                return await tcs.Task;        
            }

专门针对这行代码:

List_ = JsonConvert.DeserializeObject<List<MyObject>>(response.Content);

它真的是异步的吗?因为它似乎阻止了用户界面。你能告诉我如何使这个函数正确异步吗?

最佳答案

作为参数传递给 ExecuteAsync 的委托(delegate)似乎正在 UI 线程上执行。如果是这种情况,只需使用 Task.Run 在线程池上运行委托(delegate)即可。

client.ExecuteAsync(request, async (response) =>
    {
        if (response.StatusCode == HttpStatusCode.OK)
        {
            var list = await Task.Run( () => JsonConvert.DeserializeObject<List<MyObject>>(response.Content));
            tcs.SetResult(list);
        }
        else
        {
            MessageBox.Show("Error");
        }
    });

List_ 是一个字段吗?在我看来它应该是一个局部变量。此外,在反序列化 json 之前无需使用空列表对其进行初始化。

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

相关文章:

c# - MediaElement 不播放流 WP7 中的音频

c# - Pinvoke 调用总是返回 -1

c# - 异常 block 之前是否需要一个空的评估堆栈?

javascript - 将 Python 请求(在 Django views.py 中)Json 数据传递给 Javascript

sql - 从表中选择 JSON_VALUE 返回 null 而不是值

c# - 在 WPF\C# 中模拟按下按钮时的退格键

c# - 如何在我的 ViewModel 中监听来自另一个 ViewModel 的更改?

c# - Visual Studio - 如果未检查返回值,是否可以生成警告?

.net - 为什么 Char.MinVal/.MaxVal 不是静态的?

javascript - PHP - 为什么我从编码的对象数组中得到奇怪的结果?