繁体   English   中英

异步任务阻塞了 UI

[英]Async task is blocking the UI

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

来自RichTextBoxTextChanged事件处理程序:

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;
        }
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM