在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();
    }

我更改了图片框的图像,以通知用户长时间运行的进程的进度。这部分工作得很好,但是按钮不显示,定时器从未启动。我已经遍历了代码,我可以确认它的运行没有任何问题,这使它更加令人困惑。你知道是什么导致了这个问题吗?

在form_load事件中导致奇怪行为的任务

Task.Run用于将cpu密集型工作推离UI线程。由于您调用的是异步方法,我怀疑它不是cpu密集型的。

所以,你可以只用asyncawait:

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());