c# - 使用 .net 4.5 在 C# 中发布 json 异步时保持 UI 功能

标签 c# asynchronous async-await

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

相关文章:

asp.net - 如何让 ASP.NET MVC 从 IRouteHandler.GetHttpHandler() 识别 IHttpAsyncHandler?

c# - Parallel.For与ThreadPool和异步/等待

rust - 从 Rust 中的函数返回异步函数

c# - 如何确保数据流 block 仅按需创建线程?

c# - SQLite.Interop.DLL 如何使用非托管 DLL

c# - asp.net 中的列表框未获取选定的项目

javascript - 访问 Node js 模块中的变量

networking - 在应用程序中一起使用 pyglet、twisted、pygtk

c# - 如何隐藏有关缺少列详细信息的行的 TreeListView 错误消息?

c# - 如何在 C# 中将两个 List<Class> 相加?