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

本文关键字:任务 UI 计划 线程 WPF 创建 工厂 是否 | 更新日期: 2023-09-27 18:34:10

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

所以想知道使用任务工厂进行服务调用是否有任何问题,因为会有许多线程闲置,直到服务调用完成?

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

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

这就是

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

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

  • 使用在 UI 线程上执行其任务的任务计划程序(例如通过使用 TaskScheduler.FromCurrentSynchronizationContext
  • 指定对从 UI 线程上执行的任务继续的任务TaskContinuationOptions.ExecuteSynchronously

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

从 UI 线程

启动 async 方法时,将捕获SynchronizationContext,并且在每次await之后,代码将在 UI 线程上执行,除非使用 ConfigureAwait(false)

但是,有时调用 async 方法不会立即产生(取决于其实现),因此在这些情况下,为了避免阻塞 UI 线程,请使用 Task.Run

例如:

async Task DoSomethingAsync()
{
   await Task.Run(() => CallServiceAsync());
   // Update UI
}