是否可以保证使用任务工厂创建的任务不会在 WPF 的 UI 线程中计划
本文关键字:任务 UI 计划 线程 WPF 创建 工厂 是否 | 更新日期: 2023-09-27 18:34:10
以前我曾经使用后台工作线程进行服务调用,并且不阻止UI线程。目前开始使用TPL,但理想情况下,任务应该用于CPU密集型任务。
所以想知道使用任务工厂进行服务调用是否有任何问题,因为会有许多线程闲置,直到服务调用完成?
另外,对于原始问题,是否可以保证创建的任务将始终在与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
}