首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用.net 4.5在C#中发布json异步时保持UI功能

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

Stack Overflow用户
提问于 2013-06-02 18:09:54
回答 1查看 408关注 0票数 2

我对异步编程仍然是个新手。我有一个相对简单的程序,它发送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请求来执行它的工作。

代码语言:javascript
复制
    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);
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16881762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档