是否可以保证使用任务工厂创建的任务不会在WPF的UI线程中安排?

时间:2012-05-13 05:24:39

标签: c# .net wpf multithreading task-parallel-library

以前我曾经使用后台工作线程进行服务调用而不是阻止UI线程。目前开始使用TPL,但理想情况下任务应该用于CPU密集型任务。

所以想知道使用任务设备进行服务调用是否有什么问题,因为会有很多线程在服务调用完成之前一直处于空闲状态?

同样对于原始问题,是否可以保证在WPF应用程序中与UI线程不同的线程上始终调用创建的任务?

2 个答案:

答案 0 :(得分:6)

这就是TaskCreationOptions.LongRunning的用途。这告诉任务调度程序该任务需要一段时间才能完成,因此不会使用线程池的有限资源。

关于您的实际问题,在UI线程上执行任务的唯一可能方式是:

答案 1 :(得分:6)

任务是计划以某种方式运行 的工作的抽象。它不必是CPU密集型的。

通常,当您创建Task时,它使用默认调度程序,该调度程序在线程池上调度它(这意味着它不会在UI线程上)。您可以使用TaskScheduler.FromCurrentSynchronizationContext创建一个将工作发布到UI线程的调度程序。

要使用任务实现与BackgroundWorker类似的行为,您可以使用:

var syncScheduler = TaskScheduler.FromCurrentSynchronizationContext(); // must be called on the UI thread
var task = ... // create the task
task.ContinueWith(t => { /* update the UI here */ }, syncScheduler);

关于服务调用,如果您不想浪费线程池线程等待IO,则应使用WCF的APM模式,并结合TaskFactory.FromAsync,如this post中所述。< / p>