2011-02-24 97 views
1

我已經在Silverlight/C#中創建了一個渲染器。目前,我正在使用System.Threading.ThreadPool來安排並行渲染圖塊。這現在工作得很好,但我想限制使用的線程數。是否有最大線程數的Silverlight線程池?

因爲這可以運行在Silverlight中有幾個限制:

  • 如果我打電話ThreadPool.SetMaxThreads應用程序崩潰as documented
  • 沒有任務並行庫

我看到幾個選項:

  • 查找OSS /第三方線程池
  • 實現自己的線程池(我寧願不要)
  • 使用的Rx(這是我在其他地方做的)

是否有任何測試替代主題與Silverlight一起使用的池?

或者任何人都可以想出一個Rx表達式,它產生有限數量的線程並對這些線程進行排隊工作?

+0

爲什麼要更改線程數。要使用線程池,您的任務不應該運行很長時間。考慮到這一點,已考慮到核心數量,它必須非常高效。您是否在wpf應用程序中試過您的代碼,並確認應用程序可以更有效地使用您設置的數字? – 2011-02-24 14:31:43

+0

我還沒有測試過WPF應用程序,我不確定它會更有效率。我想嘗試一下,看看它是否更高效,我希望能夠做到這一點,以調試和理解任何同步問題。 – 2011-02-24 14:42:52

+0

很難調試多線程應用程序,並相信我,當程序遇到斷點並暫停自己時,您不會看到太多的同步問題。您需要爲此分析器。看看[這個](http://stackoverflow.com/questions/2222826/profiling-net-thread-contention) – 2011-02-24 15:29:08

回答

0

退房Ami Bar's SmartThreadPool。它有大量缺省默認.NET線程池功能,允許您爲每個線程池實例設置MaxThreads屬性,並支持Silverlight。

1

如果您使用Rx,那麼它似乎可以很容易地編寫您自己的IScheduler實現。這可能只是應用一個簡單的信號量,然後將工作傳遞給ThreadPool。通過這種方法,您可以離開ThreadPool,允許在您針對界面進行編碼時進行測試,並且您還將擁有良好的測試接縫。另外,如你自己寫的那樣,你實際上可以使用你自己管理的一組線程(而不是線程池),這樣你就可以避免ThreadPool餓死了。