【问题标题】:Is there a Thread Pool for Silverlight with a maximum number of threads?Silverlight 是否有具有最大线程数的线程池?
【发布时间】:2011-02-24 14:18:53
【问题描述】:

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

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

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

我看到了几个选项:

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

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

或者任何人都可以想出一个 Rx 表达式来产生有限数量的线程并在这些线程上排队工作?

【问题讨论】:

  • 为什么要更改线程数。要使用线程池,您的任务不应长时间运行。因此,考虑到它已经设置为核心数量这一事实,它必须非常有效。您是否在 wpf 应用程序中尝试过您的代码,并确认应用程序使用您设置的数字更有效地工作?
  • 我没有使用 WPF 应用程序进行测试,我不确定它是否会更有效。我想试试这个,看看它是否更有效,我希望能够这样做以调试和理解任何同步问题。
  • 很难调试多线程应用程序,相信我,您不会看到太多同步问题,因为程序会遇到断点并自行暂停。为此您需要一个分析器。看看[这个] (stackoverflow.com/questions/2222826/…)
  • 是的,当然.. 调试和理解同步问题是我提到的两个不同的需求。

标签: c# silverlight threadpool system.reactive


【解决方案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 */);

【讨论】:

    【解决方案2】:

    如果您使用 Rx,那么您似乎可以很容易地编写自己的 IScheduler 实现。这可以只应用一个简单的信号量,然后将工作传递给 ThreadPool。使用这种方法,您可以离开 ThreadPool,允许在针对接口进行编码时进行测试,并且您还将有良好的测试接缝。

    此外,正如您自己编写的那样,您实际上可以使用自己管理的少量 (

    【讨论】:

      【解决方案3】:

      查看 Ami 酒吧的 SmartThreadPool。它在默认的 .NET 线程池中缺少大量功能,允许您为每个线程池实例设置 MaxThreads 属性,并支持 Silverlight。

      【讨论】:

        猜你喜欢
        • 2015-07-26
        • 2013-03-16
        • 2017-06-11
        • 1970-01-01
        • 1970-01-01
        • 2014-12-19
        • 2017-08-17
        • 2013-10-06
        • 2020-11-28
        相关资源
        最近更新 更多