任务中的调用失败
本文关键字:失败 调用 任务 | 更新日期: 2023-09-27 18:33:13
我有这段代码:
var task = System.Threading.Tasks.Task.Factory.StartNew(() =>
{
// Code...
Invoke(new Action(() => progressBar.Increment(1)));
// Code...
});
task.Wait();
但是调用失败,没有异常或任何类型的错误。似乎"等待"阻止了表单的刷新,可能是因为我仍在该方法中。
我该如何解决这个问题?
谢谢
你给自己一个死锁。
当任务正在运行(在不同的线程上)并且您调用Invoke
时,它希望在主线程上调用它。但是主线程正在等待任务完成... (任务。等待()将阻塞,直到它准备好)
如果您使用:
await task;
使用此代码的方法应标记为异步。编译器会将方法切成碎片,在等待时,消息循环/线程再次运行。任务准备就绪后,将执行该方法的其余部分。(在等待任务下方;)
<小时 />查看此处以获取更多信息:等待与任务.等待 - 死锁?
这是一个
死锁。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