我有一个在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();
}
我更改图片框的图像以通知用户长时间运行过程的进度。该部分工作正常,但按钮不显示,计时器永远不会启动。我已经完成了代码,我可以确认它运行没有任何问题,这使得这更令人困惑。什么会引起这个问题?
答案 0 :(得分:2)
Task.Run
用于推动UI线程的CPU密集型工作。由于您正在调用异步方法,我怀疑它不是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
处,会显示用户界面,用户可以与之互动(这就是重点)。
答案 1 :(得分:0)
getTBox.Wait()
将尝试同步完成该任务。因此,代码之后的其余代码将在在任务完成之后发生。
我认为你根本不希望你的任务同步运行,而是异步处理它的完成,如下所示:
getTBox.ContinueWith(() => updateStatusInUI());