异步任务正在阻止 UI

Async task is blocking the UI

尊敬的同事们大家好,每次从我的串口收到一条新消息到我的 RichTextBox 时,我都需要保存到一个文本文件中。我正在尝试使用 asyncawait 它不会在保存文本文件时阻止 UI,但不幸的是我做错了,因为它仍然阻止。请问我做错了什么?

TextChanged 来自 RichTextBox 的事件处理程序:

private async void rtb_msg_TextChanged(object sender, EventArgs e)
{
    btn_save.Enabled = true;
    rtb_msg.ScrollToCaret();
    rcvFlag = true;
    await SaveFile();
}

异步SaveFile方法:

private async Task SaveFile()
{
    if (_serialPort.BytesToRead == 0 && rcvFlag == true)
    {
        for(int i = 0; i < 10; i++)
        {
            Thread.Sleep(1000);
        }
        using (StreamWriter writer = new StreamWriter(reportFolder + reportFile))
        {
            await writer.WriteAsync(rtb_msg.Text);
        }
        rcvFlag = false;
    }
}

这部分肯定会阻塞你的UI线程:

for(int i = 0; i < 10; i++)
{
    Thread.Sleep(1000);
}

不确定它为什么在那里,但如果你用异步版本替换它,它应该可以工作:

for(int i = 0; i < 10; i++)
{
    await Task.Delay(1000);
}

切勿在异步方法中使用 Thread.Sleep。使用 Task.DelayTask.Run 代替

private Task SaveFileAsync()
{
    return Task.Run(async () =>
    {
        if (_serialPort.BytesToRead == 0 && rcvFlag == true)
        {
            for (var i = 0; i < 10; i++)
            {
                await Task.Delay(1000);
            }
            using (var writer = new StreamWriter(reportFolder + reportFile))
            {
                await writer.WriteAsync(rtb_msg.Text);
            }
            rcvFlag = false;
        }
    });
}