我订阅了一个服务,当接收到新元素时,该服务会触发事件,我将此元素添加到一个
我有一个第二个线程在运行,它将循环
问题是如何在
“An unhandled exception of type 'System.StackOverflowException' occurred in Unknown Module.”
故障排除提示如下:
"确保您没有无限循环或无限递归"
事实上,我确实有某种形式的无限循环,因为
BlockingCollection
中。我有一个第二个线程在运行,它将循环
BlockingCollection
,以将元素添加/更新到可观察集合中。问题是如何在
ObservableCollection
中添加元素?
我知道我不能仅仅在这种类型的集合上执行.add
,因为它需要在UI线程上执行。所以我尝试使用不同的ObservableCollection
子类,它们使用dispatcher来调度添加元素,但每一次都会遇到相同的错误“An unhandled exception of type 'System.StackOverflowException' occurred in Unknown Module.”
故障排除提示如下:
"确保您没有无限循环或无限递归"
事实上,我确实有某种形式的无限循环,因为
BlockingQueue
一直在接收新元素,大约每秒5到10个左右。
如果我不将控件绑定到observablecollection
,或者使用List而不是observablecollection
,则不会出现异常。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);
}
}
}
编辑 当我追踪问题时,这个bug突然自己消失了。我尝试简化事情以便真正理解问题出在哪里,然后它开始工作了。当把事情重新组合起来时,它仍然可以工作...但是偶尔会出现一些看起来不相关的原因,比如向我的listview添加样式。我开始认为第三方dll存在问题。