小编kst*_*s51的帖子

使用BlockingCollection更新ObservableCollection

我订阅了一项服务,该服务将在收到新元素时引发Event,然后将此元素添加到中BlockingCollection
我正在运行第二个线程,该线程将循环运行BlockingCollection以添加/更新可观察集合中的元素。

问题是您如何添加ObservableCollection?我知道我不能只.add对这种类型的集合执行操作,因为它需要在UI线程上完成。所以我尝试使用不同的ObservableCollection子类,该子类使用分派器来编组元素的添加,但是每一次,我都会遇到相同的错误

“未知模块中发生了'System.StackOverflowException类型的未处理的异常。”

故障排除提示如下:

确保您没有无限循环或无限递归。

好吧,实际上,我确实有某种无限循环,因为一直在BlockingQueue接收新元素,例如每秒5到10。
如果我不将控件绑定到observablecollectionough,或者使用List代替,则不会出现异常。

Class ElementHolder
{
    private ExternalService _externalService;
    private ObservableCollection<Element> _elementsList = new ObservableCollection<Element>();
    private BlockingCollection<Element> _elementsReceived = new BlockingCollection<Element>();

    public ObservableCollection<Element> ElementsList
    {
        get
        {
            return _elementList;
        }
        set
        {
            _elementList = value;
        }
    }

public ElementHolder()
    {
        Task.Factory.StartNew(ReadElements);
        _externalService = new ExternalService();
        _externalService.ReceivedNewElement += new Action<Element>(o => _elementsReceived.Add(o));
        _externalService.Subscribe();
    }

private void ReadElements()
    {
        foreach (Element element in …
Run Code Online (Sandbox Code Playgroud)

c# wpf observablecollection blockingcollection

5
推荐指数
1
解决办法
1592
查看次数