0

我正在尝试在 c# 中为异步/等待编写一些演示。我有一个控制器,它通过串行 COM 端口连接,它可以回显我写给它的所有内容。

所以我只是打开 SerialPort 并写。但是将来这个控制器可能会做一些艰苦的工作——他会拿着我在上面写的东西,然后在大约 2-3 秒内努力工作。

所以。我可以将任务发送到我的控制器,我必须等待几秒钟才能读取结果。但我不希望我的 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 - 第二个任务准备好了 - 我得到了结果,它正在写入日志

textBox.Text = textBox.Text(在第二个 1获得)+ result2。

...

在第二个 14 - 最后一个任务准备好了 - 我得到了结果,它正在写入日志

textBox.Text = textBox.Text(在第二个 1获得)+ result4。

如果有人理解我,请帮助,如何解决这个问题?

4

0 回答 0