我对异步编程仍然是个新手。我有一个相对简单的程序,它发送json并接收回json。程序本身运行良好,但我正在努力学习如何使ui保持响应性。当我在.net 4.5中学习异步和等待时,似乎终于有了一种对我有意义的多线程方法。我所做的似乎部分成功了。但仍然有一些时刻,我的程序仍然在短时间内变得没有响应。我担心大部分问题都存在于下面这段代码中,但我不太明白原因。
通信层的完整代码可以在这里找到: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);
}
}发布于 2013-06-08 18:25:21
JSON我在代码中没有看到任何阻塞,除非你有一些在代码中不明显的情况(例如,一个非常大的
响应)。题外话:你应该使用async Task而不是async void -你可能会发现我的async/await介绍和MSDN文章很有帮助。首选SemaphoreSlim或DefaultConnectionLimit而不是空的while循环。此外,考虑在其项目模板中切换到JSON.NET - MS uses JSON.NET now。-斯蒂芬·克利里Jun 2,12:52
https://stackoverflow.com/questions/16881762
复制相似问题