我想我在这里遗漏了一些明显的东西,但是在使用任务和检索值时如何更新 GUI?(我正在尝试使用等待/异步而不是 BackgroundWorker)
在我的控件上,用户单击了一个按钮,该按钮将执行一些需要时间的操作。我想提醒父表单,以便它可以显示一些进度:
private void ButtonClicked()
{
var task = Task<bool>.Factory.StartNew(() =>
{
WorkStarted(this, new EventArgs());
Thread.Sleep(5000);
WorkComplete(this, null);
return true;
});
if (task.Result) MessageBox.Show("Success!");//this line causes app to block
}
在我的父表单中,我正在收听 WorkStarted 和 WorkComplete 以更新状态栏:
myControl.WorkStarting += (o, args) =>
{
Invoke((MethodInvoker) delegate
{
toolStripProgressBar1.Visible = true;
toolStripStatusLabel1.Text = "Busy";
});
};
如果我错了,请纠正我,但应用程序挂起,因为“Invoke”正在等待 GUI 线程可用,直到我的“ButtonClicked()”调用完成。所以我们陷入了僵局。解决这个问题的正确方法是什么?