我有这个代码:
var task = System.Threading.Tasks.Task.Factory.StartNew(() =>
{
// Code...
Invoke(new Action(() => progressBar.Increment(1)));
// Code...
});
task.Wait();
但是调用失败,没有异常或任何类型的错误。似乎“等待”阻止了表单的刷新,可能是因为我还在方法中。
我该如何解决这个问题?
谢谢
我有这个代码:
var task = System.Threading.Tasks.Task.Factory.StartNew(() =>
{
// Code...
Invoke(new Action(() => progressBar.Increment(1)));
// Code...
});
task.Wait();
但是调用失败,没有异常或任何类型的错误。似乎“等待”阻止了表单的刷新,可能是因为我还在方法中。
我该如何解决这个问题?
谢谢
你让自己陷入了僵局。
当任务运行时,它想在主线程上调用。但是主线程正在等待任务完成...... (task.Wait()将阻塞,直到它准备好)
如果你使用:
await task;
使用此代码的方法应标记为异步。编译器会将方法切成小块,在等待时,消息循环/线程再次运行。当任务准备好时,将执行该方法的其余部分。(在等待任务下方;)
在这里查看更多信息:await vs Task.Wait - Deadlock?
这是一个僵局。UI线程阻塞task.Wait()
在线,等待任务完成。该任务正在阻塞,Invoke
因为它需要告诉 UI 线程更新进度条。
您不应等待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