异步JSON反序列化

use*_*650 6 .net c# json asynchronous windows-phone-8

我需要做一个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;        
            }
Run Code Online (Sandbox Code Playgroud)

特别为这行代码:

List_ = JsonConvert.DeserializeObject<List<MyObject>>(response.Content);
Run Code Online (Sandbox Code Playgroud)

真的是异步吗?因为它似乎阻止了UI.你能告诉我怎样才能使这个功能正常异步?

dca*_*tro 8

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

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");
        }
    });
Run Code Online (Sandbox Code Playgroud)

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

  • @ user2505650说实话,我对Windows Phone API不太了解,但这是一个简单的测试:添加Thread.Sleep(5000)并运行代码-如果它阻止了UI,那么它将在UI线程。 (2认同)