我有这段代码:
var task = System.Threading.Tasks.Task.Factory.StartNew(() =>
{
// Code...
Invoke(new Action(() => progressBar.Increment(1)));
// Code...
});
task.Wait();
但Invoke失败,没有Exception或任何类型的错误。 似乎“等待”阻止了表单的刷新,可能是因为我仍然在方法中。
我该如何解决这个问题?
由于
答案 0 :(得分:2)
你有一个死锁。
当Task运行时,它想要在mainthread上调用。但是mainthread正在等待Task完成... (task.Wait()将阻塞直到它准备就绪)
如果您使用以下内容:
await task;
使用此代码的方法应标记为async。编译器会将方法切割成碎片,等待时,messageloop / thread再次运行。任务准备就绪后,将执行该方法的其余部分。 (在等待任务下面;)
点击此处了解更多信息:await vs Task.Wait - Deadlock?
答案 1 :(得分:1)
这是一个僵局。 UI线程在task.Wait()
行阻塞,等待任务完成。该任务在Invoke
上阻塞,因为它需要告诉UI线程更新进度条。
您应 NOT 等待在UI线程上完成任务,并应删除task.Wait()
。一旦任务完成,UI将立即更新。
您要放在task.Wait()
下面的任何代码都应该进入Invoke操作:
var task = System.Threading.Tasks.Task.Factory.StartNew(() =>
{
// do task work
Invoke(new Action(() => {
progressBar.Increment(1);
// other code that needs the task to be finished should go here
}));
});
// don't call task.Wait() here