【问题标题】:How to properly avoid Thread creation overhead / reuse thread in C#如何在 C# 中正确避免线程创建开销/重用线程
【发布时间】:2014-02-16 22:10:56
【问题描述】:

假设我有以下应该尽快执行的循环:

while(true)
{
    A();
    B();
    C();
}

遵循以下规则: B() 只能在 A() 完成后启动,C() 只能在 B() 完成后启动。
B() 具有很高的多线程潜力。

如果我在 B() 中创建新线程来拆分工作,与非并行解决方案相比,它的执行速度会更慢!

我想这是线程创建开销。
我创建了一个变体,其中 B() 的并行线程是在 while(true) 循环之外创建的。
每个线程都有一个布尔值来表示它已完成,每个线程都有一个布尔值来表示它有新的工作要做。

线程和 C() 正在通过以下 sn-p 等待它们的继续:

while(!boolean)
    Thread.Sleep(1);

当 B() 的工作非常小时,这比其他变体慢。当 B() 具有预期的最大工作量时,它比其他变体更快。

这种布尔等待方法似乎非常低效和愚蠢......
threadInstance.Resume() 已弃用。

我很确定这是错误的方式。
我的问题的正确解决方案是什么?
我听说过线程池和任务。这是我应该研究的吗?
我避开了这些概念,因为我在阅读它们时无法快速理解它们。

【问题讨论】:

  • 再次阅读线程池。线程池被用来重用线程。实际上,.NET 已经为您准备好了!
  • 我避开了这些概念,因为我在阅读它们时无法快速理解它们。 “我想要一个高性能的多线程应用程序,我想轻松地做到这一点现在就想要,我想要一匹小马”
  • “我想这是线程创建开销。”分析比猜测可靠得多。

标签: c# .net multithreading concurrency


【解决方案1】:

任务。阅读任务。

一个任务在b中的所有任务之后,当它们完成后跟随着C。

您尝试解决很久以前使用 Task API 解决的问题(我认为是在 .NET 4.0 时间范围内)。

【讨论】:

  • +1 但 OP 已尝试阅读任务 我避免使用这些概念,因为在阅读它们时我无法快速理解它们。
  • 除非你有明确的利益和目标,否则学习并不有趣 (;
  • @Traubenfuchs 是的,但正如您所看到的那样有好处。事实上,任务是为数十万个小操作完成的——因此它们经过了极大的优化;)
【解决方案2】:

正如@TomTom 所说,Task API 是正确的选择。

Task API 在 .NET 4.0 中引入并在 .NET 4.5 中进行了改进。对于以前的 .NET 版本,Asynchronous Programming Model (APM) 是正确的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 2020-11-07
    • 2011-01-08
    • 2021-07-29
    • 1970-01-01
    相关资源
    最近更新 更多