【问题标题】:Is .NET TPL using a queue under the hood? [closed].NET TPL 是否在后台使用队列? [关闭]
【发布时间】:2020-03-31 15:16:26
【问题描述】:

我是 .NET 新手,我想知道 TPL(任务并行库)是否在后台使用队列来执行您启动的任务?

那么我可以“排队”或启动尽可能多的任务,而 .NET 会处理这个吗?那我为什么需要 BlockingQueue 等呢?

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

简而言之:我可以使用 TPL 将任务“排队”,还是需要一个 BlockingQueue 左右来通过 API 处理我的传入消息?

谢谢

【问题讨论】:

  • 您认为为什么需要手动“排队”任务?
  • 你已经走得太远了。阅读 .NET Core 如何处理请求。如果您需要异步处理,TAP 将在大部分时间为您服务。 如果您正在进行“长时间运行”的处理,请将此信息添加到您的问题中,因为那是完全不同的故事。
  • @bbrinck 如果你想在 ASP.NET Core 应用程序中使用一些通用的后台工作人员,我建议使用可以处理排队作业的托管服务。我用一个例子来详细解释in this answer
  • 好的,那么。查看 poke 评论中的链接并试一试。但是您知道吗:如果您最初认为 TPL 是一种解决方案,请尝试一下。也许你失败了。失败就是学习。请注意,您可能需要考虑采用不同的方法:)
  • 您可能会觉得这很有趣:Fire and forget on ASP.NET。正确的解决方案并不容易。

标签: c# .net asp.net-core task-parallel-library


【解决方案1】:

你可以,但你不应该。任务在后台使用线程池。

首先,它不受约束,因此您无法控制排队/启动的数量,这意味着您几乎无法控制启动、运行或等待处理的数量。如果任务运行时间更长,后台任务可能会使用池中的所有可用线程并且请求必须等待。使用队列和工作进程,您可以获得更多控制权,即 1 个队列和 2 个后台进程。那么您随时都知道,同时处理的后台任务不超过 2 个。

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

【讨论】:

  • 谢谢。好的,您将如何创建一个队列和一个任务/线程来处理 .NET Core WebApi 中的队列?
【解决方案2】:

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

【讨论】:

  • “如果您必须等待任务完成,那么等待就是您的朋友!” 并非在所有情况下。如果有一些繁重的长时间运行进程,请求可能会超时。所以,为此你需要一个不同的模式。
  • 不,我不需要等待任务。 API 消息应在后台处理。我会使用 Hangfire,但如果我说 TPL 是一个队列是正确的,我看不到那里的意义,所以我可以使用 TPL 将它们排队。
猜你喜欢
  • 2011-05-28
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多