[英]Async task is blocking the UI
Hello esteemed colleagues, I need to save to a text file every time I get a new message from my serial port into my RichTextBox
.尊敬的同事们,您好,每次从我的串口收到一条新消息到我的RichTextBox
时,我都需要保存到一个文本文件中。 I'm trying to use async
and await
it won't block the UI while saving the text file, but unfortunately I'm doing something wrong because it still blocking.我正在尝试使用async
并await
它在保存文本文件时不会阻塞 UI,但不幸的是我做错了什么,因为它仍然阻塞。 Please, what am I doing wrong?请问,我做错了什么?
TextChanged
event handler from RichTextBox
:来自RichTextBox
的TextChanged
事件处理程序:
private async void rtb_msg_TextChanged(object sender, EventArgs e)
{
btn_save.Enabled = true;
rtb_msg.ScrollToCaret();
rcvFlag = true;
await SaveFile();
}
Async SaveFile
method:异步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;
}
}
This part will definitely block your UI thread:这部分肯定会阻塞你的 UI 线程:
for(int i = 0; i < 10; i++)
{
Thread.Sleep(1000);
}
Not sure why it's there, but if you replace it with an async version, it should work:不知道为什么它在那里,但如果你用异步版本替换它,它应该可以工作:
for(int i = 0; i < 10; i++)
{
await Task.Delay(1000);
}
Never use Thread.Sleep
in async methods.切勿在异步方法中使用Thread.Sleep
。 Use Task.Delay
and Task.Run
instead使用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.