如何在C#中正确避免线程创建开销/重用线程

时间:2014-02-16 22:10:57

标签: c# .net multithreading concurrency

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

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

遵守以下规则: B()只能在A()完成后启动,C()只能在B()完成后启动 B()很有可能是多线程的。

如果我在B()中创建新线程来分割工作,那么与非并行解决方案相比,它执行得更慢!

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

线程和C()正在等待它们继续使用以下片段:

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

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

这种布尔等待方法似乎非常低效且愚蠢......
不推荐使用threadInstance.Resume()。

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

2 个答案:

答案 0 :(得分:3)

任务。阅读任务。

任务完成后b中的所有任务,后跟C完成。

你尝试解决很久以前使用Task API解决的问题(在.NET 4.0时间框架中,我认为)。

答案 1 :(得分:0)

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

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