我对异步编程还是很陌生。我有一个相对简单的程序,它发送 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 块。我的程序目前不应该进入代码开头的空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);
}
}