是否有一个具有最大线程数的Silverlight线程池?

时间:2011-02-24 14:18:53

标签: c# silverlight threadpool system.reactive

我在Silverlight / C#中创建了一个渲染器。目前我正在使用System.Threading.ThreadPool来安排并行渲染切片。这现在很好用,但我想限制使用的线程数。

由于这在Silverlight上运行,因此存在一些限制:

  • 如果我致电ThreadPool.SetMaxThreads,则应用程序崩溃as documented
  • 没有任务并行库

我看到了几个选项:

  • 查找OSS /第三方线程池
  • 实现我自己的线程池(我不愿意)
  • 使用Rx(我在其他地方使用)

是否有任何经过测试的替代线程池可以与Silverlight一起使用?

或者任何人都可以想出一个Rx表达式,它会生成有限数量的线程并对这些线程进行排队工作吗?

3 个答案:

答案 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。