c# - 基于任务的异步模式 (TAP) 和任务并行 (TPL) 与任务(或任务),线程可以做什么) 无法做到?
问题描述
在阅读 C# 中的多线程(来自 MSDocs 和Stephen Cleary 的Concurrency in C#等书籍)时,我反复遇到的建议基本上归结为:线程是较旧的、低级别的并发抽象被Task
和Task<T>
类取代。
现在我明白任务更高级别、功能更丰富和强大,并且几乎可以做任何线程以前用于异步和并行的事情。
我的问题是:有什么线程可以做的,新Task
的Task<T>
等等不能做,所以我花时间学习多线程,以防万一我遇到这些用例?
解决方案
由于您提到的所有原因,任务都很好,它们可以重用池中的线程。这避免了拥有大量线程的开销(每个线程都需要一个堆栈,以及内核中的一些控制结构,跟踪它们等等),也避免了任务切换的开销——内核在线程之间转换需要一些周期. 如果您有很多线程竞争同一个 CPU,那么您将花费更多时间进行切换,而花费更少的时间来做实际工作。
根据对您问题的评论之一,直接使用线程意味着您可以控制生命周期,我唯一能想到的另一件事是线程本地存储(https://docs.microsoft.com/en-us/dotnet/standard /threading/thread-local-storage-thread-relative-static-fields-and-data-slots)。
推荐阅读
- python - 张量流中神经网络的多个输入?
- batch-file - 通过 STRING NAME 批量检查空变量
- typescript - Typescript 是否允许在对象或接口的类型定义中使用扩展运算符?
- javascript - 如何错误处理 requestAnimationFrame 函数
- list - 如何不显示 v-for 中的所有项目
- python - ORM:发票。v10 中的 compute_taxes 的 v14 等价物是什么?
- powershell - 多行注释未显示在来自 ADO 发布管道中的手动干预作业的电子邮件通知中
- sql - 如何在 SQL Server 中显示交叉联接表中所有项目的计数
- android - Compress Video with FFmpeg
- python - Python 如何编辑/更新 GitHub 要点?