在哪种情况下应该使用不同的.NET线程方法?

我一直在研究处理多线程.NET应用程序的不同方法。它变得有点混乱。

新线程->当需要一个附加线程时?

ThreadPool->需要多个线程时。使用现有线程并将优化(基于所涉及工作的数量)留给框架使用会更便宜。

任务->当您需要其他线程时,碰巧使用.net 4.0或更高版本。这是新线程的API吗?

Parallel.for->当您有多个任务并且希望框架处理优化以根据CPU内核数分配有关不同任务的工作时。

在MSDN上,它没有声明新的Thread方法已过时?

基里尔·施伦斯基(Kirill Shlenskiy)

您对Threads和ThreadPool用法的基本理解是正确的。Task但是,要复杂一些。

线程,线程池,任务

首先,一个Task简单地表示一个异步操作。它可以在ThreadPool线程上执行(如果您是一个计划任务的人,那么通常它会像您TaskScheduler.Default大部分时间一样使用)。它也可以在单独的非线程池线程上执行(当您指定时TaskCreationOptions.LongRunning)。它甚至可以在没有线程的情况下执行(请考虑异步IO操作:http : //blog.stephencleary.com/2013/11/there-is-no-thread.html)。最后,当aTask封装多个异步操作时,它可以是上述任何方法的组合。

最终TaskThread之上添加一个抽象层ThreadPool(在适当时在内部使用,并且在计划任务时可以对此进行一定程度的控制)。Task由于围绕它建立的语言支持,这三种线程方法应该是您选择的武器。Task与使用低级线程工具执行异步操作序列相比,使用此控件可轻松进行。

这不,但是,意味着ThreadThreadPool真正过时-只是,他们不应该是你的电话对新开发的第一个点。抛开即使在使用时它们仍然被框架隐藏的事实Task,请考虑使用Thread的全功能生产代码的数量ThreadPool,以及一旦用这两种类型标记了它们会发生什么情况的ObsoleteAttribute一团糟。

当然,还有其他原因也要使用它们,例如,对性能非常敏感的场景(我敢肯定还有更多,但这就是我现在能想到的全部)。

使用Task安排工作

在安排新计划时,关于何时使用ThreadPool还是要考虑的问题Thread仍然适用Task.。这里的准则很简单:

  • 如果期望任务连续运行(在整个过程运行期间运行的任务就是一个很好的例子),则TaskCreationOptions.LongRunning在启动时指定标志是个好主意这类似于启动新线程。
  • 如果您要异步执行某些有限的CPU绑定工作,请将其推出到过ThreadPool孔中Task.Run(它使用默认的任务计划程序,该任务计划程序恰好ThreadPoolTaskScheduler在当前实现中)。这类似于使用ThreadPool.QueueUserWorkItem(WaitCallback)
  • 如果您的任务在整个生命周期中大部分时间都在执行异步IO,则您实际上不必担心它的执行位置。

平行

现在让我们讨论一下Parallel类及其成员。首先,您具有Parallel.Invoke,大致相当于并行启动一堆任务,然后在完成任务时阻塞。这仅在处理要并行运行的多个阻止操作时才真正有用。如果这是您的情况,并且您不想弄乱多个Task实例,请使用它。

Parallel.ForParallel.ForEach野兽略有不同,主要用于并行处理集合元素上受CPU约束的工作(由于它们内置的“负载平衡”的工作方式,因此将它们用于IO工作不是一个好主意,最终会产生太多线程除非您限制并行度)。这些方法在概念上不同于ThreadThreadPoolTask,并且更接近PLINQ。在并行化收集元素处理可显着提高性能的情况下,请在通常使用forforeach循环的情况下使用它们

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在哪种情况下,异步方法将在与调用await之前使用的线程不同的线程中继续执行?

来自分类Dev

在这种情况下,我应该使用哪种类型的消息传递?GUI向线程发送命令;爪哇

来自分类Dev

如何在不修改类的情况下使len()在类的不同实例上使用不同的方法工作?

来自分类Dev

在哪种情况下,java脚本中的对象方法比较返回false

来自分类Dev

如何找出哪种情况下挂在主线程上

来自分类Dev

哪种异常最适合“您不应该在这种情况下运行此方法”场景?

来自分类Dev

CachedNetworkImage和CachedNetworkImageProvider有什么区别?应该在哪种情况下使用?

来自分类Dev

在多次需要使用不同返回类型的情况下,两次编写同一方法的最佳实践是最好的做法吗?

来自分类Dev

我应该在以下情况下使用线程安全集合吗?

来自分类Dev

在我的情况下使用线程池

来自分类Dev

C# 到 VB.NET:在这种情况下应该使用 AddHandler 吗?

来自分类Dev

在哪种情况下使用System.UnicodeString.Format?

来自分类Dev

在哪种情况下 AsynkTaskLoader 使用缓存数据?

来自分类Dev

使用不同的参数执行哪种方法?

来自分类Dev

在这种情况下,我应该使用reduceLeft方法吗?

来自分类Dev

在这两种情况下,curl使用哪种方法进行身份验证(GET或POST)?

来自分类Dev

在ASP MVC中使用静态方法以在不同情况下使用它

来自分类Dev

在ASP MVC中使用静态方法以在不同情况下使用它

来自分类Dev

在不移动鼠标的情况下使用Synchronize在线程上调用的方法不会返回

来自分类Dev

应该在哪些线程方法中使用“同步”?

来自分类Dev

在哪种情况下,我应该更喜欢dd而不是GNU ddrescue?

来自分类Dev

在哪种情况下,我应该更喜欢ES6-maps而不是JavaScript对象?

来自分类Dev

使用分配的线程调用不同函数的多态方法

来自分类Dev

在以下情况下,我应该在ASP.net MVC中使用4条单独的路由吗?

来自分类Dev

在不使用Callable的情况下从线程引发异常?

来自分类Dev

在以下情况下如何使用线程或任务模式

来自分类Dev

在以下情况下如何使用线程或任务模式

来自分类Dev

在不使用线程的情况下并行while循环

来自分类Dev

MFC:默认情况下,使用哪种方法将工具栏按钮设置为全部工具栏按钮的子集?

Related 相关文章

  1. 1

    在哪种情况下,异步方法将在与调用await之前使用的线程不同的线程中继续执行?

  2. 2

    在这种情况下,我应该使用哪种类型的消息传递?GUI向线程发送命令;爪哇

  3. 3

    如何在不修改类的情况下使len()在类的不同实例上使用不同的方法工作?

  4. 4

    在哪种情况下,java脚本中的对象方法比较返回false

  5. 5

    如何找出哪种情况下挂在主线程上

  6. 6

    哪种异常最适合“您不应该在这种情况下运行此方法”场景?

  7. 7

    CachedNetworkImage和CachedNetworkImageProvider有什么区别?应该在哪种情况下使用?

  8. 8

    在多次需要使用不同返回类型的情况下,两次编写同一方法的最佳实践是最好的做法吗?

  9. 9

    我应该在以下情况下使用线程安全集合吗?

  10. 10

    在我的情况下使用线程池

  11. 11

    C# 到 VB.NET:在这种情况下应该使用 AddHandler 吗?

  12. 12

    在哪种情况下使用System.UnicodeString.Format?

  13. 13

    在哪种情况下 AsynkTaskLoader 使用缓存数据?

  14. 14

    使用不同的参数执行哪种方法?

  15. 15

    在这种情况下,我应该使用reduceLeft方法吗?

  16. 16

    在这两种情况下,curl使用哪种方法进行身份验证(GET或POST)?

  17. 17

    在ASP MVC中使用静态方法以在不同情况下使用它

  18. 18

    在ASP MVC中使用静态方法以在不同情况下使用它

  19. 19

    在不移动鼠标的情况下使用Synchronize在线程上调用的方法不会返回

  20. 20

    应该在哪些线程方法中使用“同步”?

  21. 21

    在哪种情况下,我应该更喜欢dd而不是GNU ddrescue?

  22. 22

    在哪种情况下,我应该更喜欢ES6-maps而不是JavaScript对象?

  23. 23

    使用分配的线程调用不同函数的多态方法

  24. 24

    在以下情况下,我应该在ASP.net MVC中使用4条单独的路由吗?

  25. 25

    在不使用Callable的情况下从线程引发异常?

  26. 26

    在以下情况下如何使用线程或任务模式

  27. 27

    在以下情况下如何使用线程或任务模式

  28. 28

    在不使用线程的情况下并行while循环

  29. 29

    MFC:默认情况下,使用哪种方法将工具栏按钮设置为全部工具栏按钮的子集?

热门标签

归档