异步任务阻塞了 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;
}
}
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
. 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. Please, what am I doing wrong?
TextChanged
event handler from RichTextBox
:
private async void rtb_msg_TextChanged(object sender, EventArgs e)
{
btn_save.Enabled = true;
rtb_msg.ScrollToCaret();
rcvFlag = true;
await SaveFile();
}
Async SaveFile
method:
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;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这部分肯定会阻塞你的 UI 线程:
不知道为什么它在那里,但如果你用异步版本替换它,它应该可以工作:
This part will definitely block your UI thread:
Not sure why it's there, but if you replace it with an async version, it should work:
切勿在异步方法中使用 Thread.Sleep。使用
Task.Delay
和Task.Run
代替Never use
Thread.Sleep
in async methods. UseTask.Delay
andTask.Run
instead