尊敬的同事,您好,每次我從串口收到一條新訊息到我的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;
}
}
uj5u.com熱心網友回復:
這部分肯定會阻塞你的 UI 執行緒:
for(int i = 0; i < 10; i )
{
Thread.Sleep(1000);
}
不知道為什么它在那里,但如果你用異步版本替換它,它應該可以作業:
for(int i = 0; i < 10; i )
{
await Task.Delay(1000);
}
uj5u.com熱心網友回復:
永遠不要Thread.Sleep在異步方法中使用。使用Task.DelayandTask.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;
}
});
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/445692.html
