在任务中调用失败

时间:2013-09-27 12:36:25

标签: c# task-parallel-library invoke

我有这段代码:

var task = System.Threading.Tasks.Task.Factory.StartNew(() =>
{
    // Code...
    Invoke(new Action(() => progressBar.Increment(1)));
    // Code...
});

task.Wait();

但Invoke失败,没有Exception或任何类型的错误。 似乎“等待”阻止了表单的刷新,可能是因为我仍然在方法中。

我该如何解决这个问题?

由于

2 个答案:

答案 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
相关问题