2

我对异步编程还是很陌生。我有一个相对简单的程序,它发送 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);
        }
    }
4

1 回答 1

0

我在该代码中看不到任何阻塞,除非您遇到一些从代码中看不到的情况(例如,非常大的 JSON 响应)。题外话:您应该使用 async Task 而不是 async void - 您可能会发现我的 async/await 介绍和 MSDN 文章很有帮助。首选 SemaphoreSlim 或 DefaultConnectionLimit 而非空的 while 循环。此外,考虑切换到 JSON.NET - MS 现在在其项目模板中使用 JSON.NET。——斯蒂芬·克利里 6 月 2 日 12:52

于 2013-06-08T10:25:20.863 回答