Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步JSON反序列化_C#_.net_Json_Windows Phone 8_Asynchronous - Fatal编程技术网

C# 异步JSON反序列化

C# 异步JSON反序列化,c#,.net,json,windows-phone-8,asynchronous,C#,.net,Json,Windows Phone 8,Asynchronous,我需要做一个RestRequest并获取一些JSON,我不确定我的方法是否真的是异步的,因为当我使用这个方法时,我的UI中仍然有一些冻结 public async Task<List<MyObject>> Load() { var tcs = new TaskCompletionSource<List<Myobject>>(); var client = n

我需要做一个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;        
            }
公共异步任务加载()
{
var tcs=new TaskCompletionSource();
var client=new RestSharp.RestClient(“https://exampleapi.com");
client.Authenticator=OAuth1Authenticator.ForProtectedResource(
[...]);
var request=new RestSharp.RestRequest(“examp.json”,Method.GET);
client.ExecuteAsync(请求、响应=>
{
if(response.StatusCode==HttpStatusCode.OK)
{
列表=新列表();
List=JsonConvert.DeserializeObject(response.Content);
tcs.SetResult(列表);
}
其他的
{
MessageBox.Show(“错误”);
}
});
返回等待任务;
}
专门针对这一行代码:

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

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

似乎正在UI线程上执行作为参数传递给
ExecuteAsync
的委托。如果是这种情况,只需使用
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");
        }
    });
client.ExecuteAsync(请求、异步(响应)=>
{
if(response.StatusCode==HttpStatusCode.OK)
{
var list=wait Task.Run(()=>JsonConvert.DeserializeObject(response.Content));
设置结果(列表);
}
其他的
{
MessageBox.Show(“错误”);
}
});

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

JsonConvert.DeserializeObject
是同步的。您可以通过它立即返回计算结果这一事实来判断。它不可能“在后台”做一些事情,只能在稍后将结果交给您

使用
任务将CPU绑定的工作移动到线程池线程。运行
。如果方便的话,您可以将整个REST请求移动到那里


注意,消息框调用应该在UI线程上运行。最好不要像现在这样在线程池线程上创建消息框。这将导致两个UI线程。消息框不会是模态的。

谢谢,我也删除了列表的初始化,通常我如何知道是否在我的UI线程上执行了操作?@user2505650老实说,我对Windows Phone API不太了解,但这里有一个简单的测试:添加
线程。睡眠(5000)
并运行代码-如果它阻止UI,然后它在UI线程上运行。谢谢,我将更改MessageBox,但是如何告知是否在UI线程上执行了操作?这通常是有文档记录的。我确信RestSharp会记录调用回调的线程。