2014-02-16 43 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