使用线程池的最佳做法

本主题介绍使用线程池的最佳做法。

应做事项

  • 使用线程池在应用中执行并行工作。

  • 使用工作项处理耗时较长的任务,而不会阻塞 UI 线程。

  • 创建生存期较短且独立的工作项。 工作项异步运行,可以从队列中以任何顺序将它们提交到池中。

  • 将更新调度到 UI 线程。 在 WinUI 3 应用中,使用 Microsoft.UI.Dispatching.DispatcherQueue 中的 DispatcherQueue.TryEnqueue

  • 使用 ThreadPoolTimer.CreateTimer 而不是 Sleep 函数。

  • 使用线程池,而不是创建自己的线程管理系统。 线程池在具有高级功能的 OS 级别运行,并经过优化,可以根据进程内和整个系统中的设备资源和活动动态缩放。

  • 在 C++ 中,确保工作项委托使用敏捷线程模型(默认情况下 C++ 委托是敏捷的)。

  • 在使用时无法容忍资源分配失败时,请使用预分配的工作项。

禁忌

  • 不要创建 period 值为 <1 毫秒(包括 0)的周期性计时器。 这样将使工作项像单次计时器一样操作。

  • 不要提交完成时间超过 周期 参数中指定时长的周期性工作项。

  • 不要尝试从后台任务调度的工作项发送 UI 更新(非 Toast 和通知)。 请改用后台任务进度和完成处理程序 ,例如 IBackgroundTaskInstance.Progress

  • 使用使用 异步 关键字的工作项处理程序时,不要假定处理程序中的所有代码在工作项上设置完整状态时已执行。 在处理程序中的所有代码都执行之前,线程池工作项可以设置为完整状态。 在将工作项设置为完整状态后,处理程序中的 await 关键字后面的代码可能会执行。

  • 请勿尝试多次运行预分配的工作项,而无需重新初始化它。 创建定期工作项