.NET TPL 是否在后台使用队列?

Is .NET TPL using a queue under the hood?

我是 .NET 的新手,我想知道 TPL(任务并行库)是否正在为您开始的任务使用队列?

那么我可以 "queue" 或启动任意数量的任务,而 .NET 会处理这个吗?那我为什么需要 BlockingQueue 等?

我问这个是因为我需要一个 WebApi (.NET Core) 来接受消息并将其放入队列,然后对其进行一些处理。如果我是对的,那么我不需要 Queue 左右,只需将 Task 排队就可以了?

简而言之:我可以只 "queue" 使用 TPL 的任务,还是我需要一个 BlockingQueue 左右来处理通过 API 收到的消息?

谢谢

调用是否需要等待任务完成?如果没有,那么最好将任务排队并在后台线程中的某个地方处理它们。如果你必须等待任务完成,那么 await 就是你的朋友!

可以,但不应该。 Task 在底层使用了一个线程池。

首先,它不受约束,所以您无法控制有多少 queued/started,这意味着您几乎无法控制有多少开始、运行 或正在等待处理。如果任务 运行ning 更长,后台任务可能会使用池中的所有可用线程,并且请求必须等待。使用队列和工作进程,您可以进行更多控制,即 1 个队列和 2 个后台进程。然后你知道在任何时候,同时处理的后台任务不超过 2 个。

其次,更重要的是,它不会使您的应用程序处理数据的速度更快。您对调用者的延迟更低(响应更快),但后台任务仍然需要相同的时间来处理。只有在没有(或低)负载时,延迟才会降低。 随着负载的增加,您可能会再次获得更长的响应(比处理任务所需的时间长得多),因为太多的后台任务(见第一点)正在 运行ning,占用所有 CPU 和线程,使请求等待。