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 void の代わりに async Task を使用する必要があります。私の async/await イントロと MSDN の記事が役立つ場合があります。空の while ループよりも SemaphoreSlim または DefaultConnectionLimit を優先します。また、JSON.NET への切り替えを検討してください。MS は現在、プロジェクト テンプレートで JSON.NET を使用しています。– Stephen Cleary 6 月 2 日 12:52

于 2013-06-08T10:25:20.863 に答える