私はまだ非同期プログラミングに本当に慣れていません。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);
}
}