如何解耦ObservableCollection?

时间:2012-05-31 11:20:22

标签: .net multithreading thread-safety threadpool observablecollection

我已经开发了一个数据获取子系统作为DLL,它使用自己的线程捕获数据并使用ObservableCollections发布数据。我遇到了几个问题,因为事件的消费者在收到ObservableCollection事件时会进行昂贵的操作,这使得我的引擎捕获数据的速度比预期慢。

我计划以不同的线程发送事件以避免这些问题,但我有几个问题:

public class ObservableCollection2
{
    public void Add()
    {
        _internalObservableCollection.Add();
        new Thread() { => Raise the event }
    }
}
  1. 这是标准解决方案已经解决的问题吗?容貌 像线程争用应该是比较常见的东西。
  2. 使用线程不会严重降低性能 应用?
  3. 使用ThreadPool不会使用所有可用的 线程在子系统中正常发送,从100发送到200 每秒通知?
  4. 感谢您的想法。

1 个答案:

答案 0 :(得分:2)

有几种想法可以解决这种情况。

  1. 客户端不能在事件处理程序中执行繁重的代码 - 毕竟,他们知道他们正在阻止处理。因此客户必须记住集合已被更改,并将处理卸载到私有线程中。
  2. 为每个事件使用新线程不是最佳解决方案。无论如何,如果你继续这样做,也许一个线程池线程是一个更好的主意。
  3. 如果有关更改的消息经常出现,或许您想要限制通知,并将它们发送到更大的包中?我不知道开箱即用的解决方案,但也许Rx扩展可能会有所帮助。
  4. ObservableCollection是一个非常沉重的阶级。我个人只在视图模型中使用它来进行视图绑定,在模型中我使用内部包含集合的自制类,并在需要时发送所需的事件。通过这种方式,我可以更好地控制发生的事情。