异步JSON反序列化

我需要做一个RestRequest并获得一些JSON,我不确定我的方法是否真的是异步,因为当我使用这个方法时,我的UI仍然有一点冻结。

public async Task<List> Load() { var tcs = new TaskCompletionSource<List>(); 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(); List_ = JsonConvert.DeserializeObject<List>(response.Content); tcs.SetResult(List_); } else { MessageBox.Show("Error"); } }); return await tcs.Task; } 

特别为这行代码:

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

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

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

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

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

JsonConvert.DeserializeObject是同步的。 您可以通过它立即返回计算结果的事实来判断。 它无法在“后台”中执行某些操作,只能在以后将结果交给您。

使用Task.Run将CPU绑定工作移动到线程池线程。 如果对您更方便,您可以在那里移动整个REST请求。

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