C# で async/wait のデモを作成しようとしています。シリアル COM ポートを介して接続されているコントローラーがあり、書き込み中のすべてをエコーできます。
だから私はSerialPortを開いて書くだけです。しかし、将来このコントローラーは大変な仕事をするかもしれません - 彼は私が書いているものを取り、約2〜3秒で一生懸命働くでしょう.
そう。Task をコントローラーに送信できますが、結果を読み取るまで数秒待つ必要があります。しかし、UI がフリーズしたくありません。そのため、async/await を使用してこの問題を解決したいと考えています。
選択したテクノロジーが正しくないかもしれませんが、役立つかもしれないと思いました。
私はこのコードでこれを解決しました:
private async void SendBtn_Click(object sender, EventArgs e)
{
if (com != null)
{
if (!com.IsOpen)
{
com.Open();
Console.WriteLine("Opened");
}
string data = Message.Text;
com.Write(data);
textbox.Text = textbox.Text +"\n" + DateTime.Now.ToString() + " : " + await readStream();
}
}
private async Task<string> readStream()
{
return await Task<string>.Run(() =>
{
return com.ReadExisting();
});
}
新しいタスクを作成するだけです->それが何かを読み取ると、それを「ログ」に書き込みます。
それは正常に動作しますが、ボタンを数回クリックすると、コントローラーにいくつかのタスクが作成され、それらを取得してすべてのタスクを処理できます。
結果を取得しているとき-最後の結果のみを取得します:
何が起こっているか: ボタンを 1 秒目、2 秒目、3 秒目、4 回目で 4 回クリックしたとします。
したがって、タスクは 4 つです。タスクごとに 10 秒実行しているとしましょう。
そのため、4 秒目のログはまだ空でした。
11 秒目 - 最初のタスクの準備ができました - 結果を取得し、次のようにログに書き込みます
textBox.Text = textBox.Text ( 1 秒目に取得したもの) + result1.
12 秒目 - 2 番目のタスクの準備ができました - 結果を取得し、次のようにログに書き込みます
textBox.Text = textBox.Text ( 1 秒目に取得したもの) + result2.
...
14 秒目 - 最後のタスクの準備ができました - 結果を取得し、次のようにログに書き込みます
textBox.Text = textBox.Text ( 1 秒目に取得したもの) + result4.
誰かが私を理解しているなら、助けてください、これを解決する方法は?