在form_load事件中导致奇怪行为的任务
本文关键字:任务 form load 事件 | 更新日期: 2023-09-27 18:03:48
我有一个任务,在winforms的一个用户控件的form_load事件中运行:
private void ucDeviceInsert_Load(object sender, EventArgs e)
{
System.Threading.Tasks.Task getTBox = System.Threading.Tasks.Task.Run(async () =>
{
await AVeryLongRunningProccess();
});
pbImage.Image = Properties.Resources.Remove;
getTBox.Wait();
pbImage.Image = Properties.Resources.Insert;
btnNext.Visible = true;
tmrDeviceInsert.Enabled = true;
tmrDeviceInsert.Start();
}
private void tmrDeviceInsert_Tick(object sender, EventArgs e)
{
Next();
}
我更改了图片框的图像,以通知用户长时间运行的进程的进度。这部分工作得很好,但是按钮不显示,定时器从未启动。我已经遍历了代码,我可以确认它的运行没有任何问题,这使它更加令人困惑。你知道是什么导致了这个问题吗?
Task.Run
用于将cpu密集型工作推离UI线程。由于您调用的是异步方法,我怀疑它不是cpu密集型的。
所以,你可以只用async
和await
:
private async void ucDeviceInsert_Load(object sender, EventArgs e)
{
pbImage.Image = Properties.Resources.Remove;
await AVeryLongRunningProccess();
pbImage.Image = Properties.Resources.Insert;
btnNext.Visible = true;
tmrDeviceInsert.Enabled = true;
tmrDeviceInsert.Start();
}
请注意,在await
中,显示了UI,并且用户可以与它交互(这就是重点)。
getTBox.Wait()
将尝试同步完成该任务。因此,在任务完成之前,它之后的其余代码不会发生。
我认为你根本不想让你的任务同步运行,而是想要异步处理它的完成,就像这样:
getTBox.ContinueWith(() => updateStatusInUI());