异步任务正在阻止 UI
Async task is blocking the UI
尊敬的同事们大家好,每次从我的串口收到一条新消息到我的 RichTextBox
时,我都需要保存到一个文本文件中。我正在尝试使用 async
和 await
它不会在保存文本文件时阻止 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.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;
}
});
}
尊敬的同事们大家好,每次从我的串口收到一条新消息到我的 RichTextBox
时,我都需要保存到一个文本文件中。我正在尝试使用 async
和 await
它不会在保存文本文件时阻止 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.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;
}
});
}