任务中的调用失败

本文关键字:失败 调用 任务 | 更新日期: 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