以前我使用后台工作线程进行服务调用并且不阻塞 UI 线程。目前开始使用 TPL,但理想情况下任务应该用于 CPU 密集型任务..
所以想知道使用任务处理进行服务调用是否有什么问题,因为会有很多线程处于空闲状态,直到服务调用完成?
同样关于原始问题,是否可以保证始终在与 WPF 应用程序中的 UI 线程不同的线程上调用创建的任务?
以前我使用后台工作线程进行服务调用并且不阻塞 UI 线程。目前开始使用 TPL,但理想情况下任务应该用于 CPU 密集型任务..
所以想知道使用任务处理进行服务调用是否有什么问题,因为会有很多线程处于空闲状态,直到服务调用完成?
同样关于原始问题,是否可以保证始终在与 WPF 应用程序中的 UI 线程不同的线程上调用创建的任务?
这TaskCreationOptions.LongRunning
就是为了。这告诉任务调度器该任务需要一段时间才能完成,因此线程池的有限资源将不会被使用。
至于您的实际问题,在 UI 线程上执行任务的唯一可能方式是:
TaskScheduler.FromCurrentSynchronizationContext
)TaskContinuationOptions.ExecuteSynchronously
在从 UI 线程上执行的任务继续执行的任务上指定任务是计划以某种方式运行的工作的抽象。它不一定是 CPU 密集型的。
通常,当您创建 a 时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
中的解释。