我订阅了一项服务,该服务将在收到新元素时引发事件,我将此元素添加到BlockingCollection
.
我有第二个线程正在运行,它将循环BlockingCollection
添加/更新可观察集合中的元素。
问题是如何添加ObservableCollection
?我知道我不能只.add
对这种类型的集合做一个,因为它需要在 UI 线程上完成。所以我尝试使用不同ObservableCollection
的子类,这些子类使用调度程序来编组元素的添加,但每一次,我都会遇到同样的错误
“未知模块中发生了‘System.StackOverflowException’类型的未处理异常。”
故障排除提示如下:
确保您没有无限循环或无限递归。
好吧,实际上我确实有某种无限循环,因为它一直在BlockingQueue
接收新元素,比如每秒 5 到 10 个。
如果我不将控件绑定到observablecollection
,或者如果我使用 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 _elementsReceived.GetConsumingEnumerable())
{
Element item = _elementsList.FirstOrDefault(o => o.ID == element.ID);
if (item == null)
{
_elementList.Add(element);
}
else
{
item.Update(element);
}
}
}
编辑当我追踪它时,该错误自行消失了。我试图让事情变得更简单,以便真正了解问题所在,然后它开始起作用。当把东西重新组合在一起时,它仍然可以工作......但它会不时地回来,因为似乎不相关的原因,比如在我的列表视图中添加样式。我开始认为第三方 dll 存在问题。