发行“;等待”;在从线程池启动的任务中

本文关键字:启动 任务 线程 等待 发行 | 更新日期: 2024-09-25 02:18:21

很明显,使用"wait"从UI线程卸载Task是一件很棒的事情——然后UI线程可以重新处理Windows消息。

但假设您使用Task.Run启动等待中的Task,它在ThreadPool的线程上启动您的代码。在代码中执行"等待"有什么价值吗(从技术上讲,有什么价值?)?

我很想说"不"。为什么要从ThreadPool线程中卸载工作?除了处理分配给它的原始任务外,它还需要做什么?

现在,如果有人回复说,如果我进行等待,ThreadPool线程实际上可以"释放"到池中并在其他地方使用,我会印象深刻,而我的异步工作仍在继续。。。

Michael

发行“;等待”;在从线程池启动的任务中

从技术上讲,它甚至可以做到吗?

是的。由于没有当前的SynchronizationContext,因此生成的延续将在(可能)不同的ThreadPool线程上运行。然而,该机制运行良好。

在该代码中执行"等待"有什么价值吗?

是的,有。见下文。

为什么要从ThreadPool线程中卸载工作?除了处理分配给它的原始任务外,它还需要做什么?

你可以腾出线程来做其他工作。ThreadPool线程是一种有限的资源。

现在,如果有人回复说,如果我进行等待,ThreadPool线程实际上可以"释放"到池中并在其他地方使用,我会印象深刻,而我的异步工作仍在继续。。

是的,事实上就是这样。

除了能够发布任务之外,这样做还有另一个巨大的优势——无论您是在ThreadPool上还是在具有同步上下文的线程上,都可以使用相同的方法和相同的代码。重用相同代码的能力也是非常有价值的。