1

我有这个代码:

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

task.Wait();

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

我该如何解决这个问题?

谢谢

4

2 回答 2

2

你让自己陷入了僵局。

当任务运行时,它想在主线程上调用。但是主线程正在等待任务完成...... (task.Wait()将阻塞,直到它准备好)

如果你使用:

await task;

使用此代码的方法应标记为异步。编译器会将方法切成小块,在等待时,消息循环/线程再次运行。当任务准备好时,将执行该方法的其余部分。(在等待任务下方;)


在这里查看更多信息:await vs Task.Wait - Deadlock?

于 2013-09-27T12:44:17.763 回答
1

这是一个僵局。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
于 2013-09-27T12:47:27.567 回答