首页 > 解决方案 > 基于任务的异步模式 (TAP) 和任务并行 (TPL) 与任务(或任务),线程可以做什么) 无法做到?

问题描述

在阅读 C# 中的多线程(来自 MSDocs 和Stephen Cleary 的Concurrency in C#等书籍)时,我反复遇到的建议基本上归结为:线程是较旧的、低级别的并发抽象被TaskTask<T>类取代。

现在我明白任务更高级别、功能更丰富和强大,并且几乎可以做任何线程以前用于异步和并行的事情。

我的问题是:有什么线程可以做的,新TaskTask<T>等等不能做,所以我花时间学习多线程,以防万一我遇到这些用例?

标签: c#multithreadingasynchronous.net-coreconcurrency

解决方案


由于您提到的所有原因,任务都很好,它们可以重用池中的线程。这避免了拥有大量线程的开销(每个线程都需要一个堆栈,以及内核中的一些控制结构,跟踪它们等等),也避免了任务切换的开销——内核在线程之间转换需要一些周期. 如果您有很多线程竞争同一个 CPU,那么您将花费更多时间进行切换,而花费更少的时间来做实际工作。

根据对您问题的评论之一,直接使用线程意味着您可以控制生命周期,我唯一能想到的另一件事是线程本地存储(https://docs.microsoft.com/en-us/dotnet/standard /threading/thread-local-storage-thread-relative-static-fields-and-data-slots)。


推荐阅读