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

时间:2015-07-21 20:26:37

标签: c# .net winforms

我有一个在winforms中的usercontrol的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();
    }

我更改图片框的图像以通知用户长时间运行过程的进度。该部分工作正常,但按钮不显示,计时器永远不会启动。我已经完成了代码,我可以确认它运行没有任何问题,这使得这更令人困惑。什么会引起这个问题?

2 个答案:

答案 0 :(得分:2)

Task.Run用于推动UI线程的CPU密集型工作。由于您正在调用异步方法,我怀疑它不是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处,会显示用户界面,用户可以与之互动(这就是重点)。

答案 1 :(得分:0)

getTBox.Wait()将尝试同步完成该任务。因此,代码之后的其余代码将在任务完成之后发生。

我认为你根本不希望你的任务同步运行,而是异步处理它的完成,如下所示:

getTBox.ContinueWith(() => updateStatusInUI());
相关问题