我在Silverlight / C#中创建了一个渲染器。目前我正在使用System.Threading.ThreadPool
来安排并行渲染切片。这现在很好用,但我想限制使用的线程数。
由于这在Silverlight上运行,因此存在一些限制:
ThreadPool.SetMaxThreads
,则应用程序崩溃as documented。我看到了几个选项:
是否有任何经过测试的替代线程池可以与Silverlight一起使用?
或者任何人都可以想出一个Rx表达式,它会生成有限数量的线程并对这些线程进行排队工作吗?
答案 0 :(得分:1)
如果您使用的是Rx,请查看:
https://github.com/xpaulbettsx/ReactiveUI/blob/master/ReactiveUI/ObservableAsyncMRUCache.cs
(将这一个文件复制到您的应用程序应该非常简单,只需将this.Log()行和IEnableLogger接口编辑一下)
使用它非常简单,只需将SelectMany更改为CachedSelectMany:
someArray.ToObservable()
.CachedSelectMany(webService)
.Subscribe(x => /* do stuff */);
答案 1 :(得分:1)
如果您使用Rx,那么您似乎很容易编写自己的IScheduler实现。这可以只应用一个简单的信号量,然后将工作传递给ThreadPool。使用这种方法,您可以使用ThreadPool,允许在对接口进行编码时进行测试,并且您还可以使用良好的接缝进行测试。
此外,正如您自己编写的那样,您实际上可以使用自己管理的小型(< 10)线程集(而不是线程池),这样就可以避免ThreadPool饥饿。
答案 2 :(得分:0)
查看Ami Bar的SmartThreadPool。它默认的.NET threadpool中缺少大量功能,允许您为每个线程池实例设置MaxThreads属性,并支持Silverlight。