我对异步编程还是很陌生。我有一个相对简单的程序,它发送 json 并接收回 json。该程序本身运行良好,但我正在努力学习如何使 ui 保持响应。当我了解 .net 4.5 中的 async 和 await 时,似乎终于有了一种对我有意义的多线程方法。我所做的似乎部分成功了。但仍有一些时候我的程序仍然会在短时间内变得无响应。我担心大部分问题出在以下代码段中,但我不完全明白为什么。
通信层的完整代码可以在这里找到: https://github.com/Jazzeroki/JazzTools/blob/master/Jazz%20Tools/LEWrapper/LEWrapper.cs
UI 的代码可以在这里找到: https://github.com/Jazzeroki/JazzTools/blob/master/Jazz%20Tools/MainForm.cs
我主要关注的代码如下。是的,我知道我应该在这里放一个 try block 。代码开头的空 while 循环目前不应该被我的程序输入,因为它只需要发出大约 3-4 个 rpc 请求来执行它的工作。
private async void PostAsync(string url, JsonTextWriter json)
{
while (rpcCount > 50)
{ }//This creates the wait time until rpc count is reset.
string server = serverURL + url;
json.AutoComplete();
string jsonToSend = json.ToString();
//if (jsonToSend == null)
// MessageBox.Show("json error " + jsonToSend);
WriteStringToLog("request");
WriteStringToLog(jsonToSend);
var httpClient = new HttpClient();
var response = await httpClient.PostAsync(server, new StringContent(jsonToSend));
//response.EnsureSuccessStatusCode();
string responseFromServer = await response.Content.ReadAsStringAsync();
WriteStringToLog("response");
WriteStringToLog(responseFromServer);
if (ServerResponseEvent != null) //deserializes the server response and passes it out as an event.
{
JavaScriptSerializer js = new JavaScriptSerializer();
Response r = js.Deserialize<Response>(responseFromServer);
if (r.id == 101)
{
sessionID = r.result.session_id;
//Console.WriteLine(sessionID);
}
ServerResponseEvent(this, r);
}
}
最佳答案
I don't see any blocking in that code, unless you have some situation that isn't apparent from the code (e.g., a very large JSON response). Off-topic remarks: You should use async Task instead of async void - and you may find my async/await intro and MSDN article helpful. Prefer SemaphoreSlim or DefaultConnectionLimit over an empty while loop. Also, consider switching to JSON.NET - MS uses JSON.NET now in their project templates. – Stephen Cleary Jun 2 at 12:52
关于c# - 使用 .net 4.5 在 C# 中发布 json 异步时保持 UI 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16881762/