[英]Async task is blocking the UI
尊敬的同事们,您好,每次从我的串口收到一条新消息到我的RichTextBox
时,我都需要保存到一个文本文件中。 我正在尝试使用async
并await
它在保存文本文件时不会阻塞 UI,但不幸的是我做错了什么,因为它仍然阻塞。 请问,我做错了什么?
来自RichTextBox
的TextChanged
事件处理程序:
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.Delay
和Task.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.