2013-09-27 67 views
0

我有这样的代码:调用失败在任务

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

task.Wait(); 

但调用失败,没有异常或任何类型的错误。 看起来“等待”阻止了窗体的刷新,可能是因为我仍然在这个方法中。

我该如何解决这个问题?

谢谢

+0

这是一个WPF应用程序? – Alden

+0

WinForm应用程序。 – Baptiste

回答

1

你让自己死锁了。

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

如果您所使用的:

await task; 

使用此代码的方法应该被标记为异步。编译器会将该方法切成块,并在等待时,再次运行messageloop/thread。当任务准备好时,该方法的其余部分将被执行。 (下面的await任务;)


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

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