0

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.

誰かが私を理解しているなら、助けてください、これを解決する方法は?

4

0 に答える 0