2014-02-16 47 views
1

比方说,我有以下的循环,应尽可能快执行的可能:
如何适当地避免在C#创建线程的开销/重用线程

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

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

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

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

螺纹和C()正在等待他们的延续与下面的代码片断:

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

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

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

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

+0

请再次阅读线程池。线程池被用来重用线程。实际上,.NET为你准备好了一份! –

+3

*我避免了这些概念,因为在阅读这些概念时我无法很快理解它们。*“我想要一个高性能的多线程应用程序,我想轻松完成,现在我想要它,我想要一只小马” –

+0

“I假设它是线程创建开销。“分析比猜测更可靠。 –

回答

3

任务。阅读任务。

b完成后跟随C的所有任务之后的任务。

你试图解决一些很久以前用Task API解决的问题(在.NET 4.0时间框架中,我想)。

+0

+1但任务阅读已经被OP试过*我避开了这些概念,因为在阅读它们时我无法很快理解它们。* –

+1

我跳过了我的影子,现在它快了6倍,谢谢。 – Traubenfuchs

+0

学习不是很有趣,除非你在你面前有一个明确的好处和目标( – Traubenfuchs