本主题介绍使用线程池的最佳做法。
应做事项
使用线程池在应用中执行并行工作。
使用工作项处理耗时较长的任务,而不会阻塞 UI 线程。
创建生存期较短且独立的工作项。 工作项异步运行,可以从队列中以任何顺序将它们提交到池中。
将更新调度到 UI 线程。 在 WinUI 3 应用中,使用
Microsoft.UI.Dispatching.DispatcherQueue中的DispatcherQueue.TryEnqueue。使用 ThreadPoolTimer.CreateTimer 而不是 Sleep 函数。
使用线程池,而不是创建自己的线程管理系统。 线程池在具有高级功能的 OS 级别运行,并经过优化,可以根据进程内和整个系统中的设备资源和活动动态缩放。
在 C++ 中,确保工作项委托使用敏捷线程模型(默认情况下 C++ 委托是敏捷的)。
在使用时无法容忍资源分配失败时,请使用预分配的工作项。
禁忌
不要创建 period 值为 <1 毫秒(包括 0)的周期性计时器。 这样将使工作项像单次计时器一样操作。
不要提交完成时间超过 周期 参数中指定时长的周期性工作项。
不要尝试从后台任务调度的工作项发送 UI 更新(非 Toast 和通知)。 请改用后台任务进度和完成处理程序 ,例如 IBackgroundTaskInstance.Progress。
使用使用 异步 关键字的工作项处理程序时,不要假定处理程序中的所有代码在工作项上设置完整状态时已执行。 在处理程序中的所有代码都执行之前,线程池工作项可以设置为完整状态。 在将工作项设置为完整状态后,处理程序中的 await 关键字后面的代码可能会执行。
请勿尝试多次运行预分配的工作项,而无需重新初始化它。 创建定期工作项