新しい要素を受け取ったときに Event を発生させるサービスに登録し、この要素を に追加しBlockingCollection
ます。監視可能なコレクション内の要素を追加/更新するために
ループする 2 番目のスレッドを実行しています。BlockingCollection
問題は、どのように ? を追加するObservableCollection
かです。.add
UI スレッドで実行する必要があるため、このタイプのコレクションでは実行できないことはわかっています。そのため、ディスパッチャーを使用して要素の追加をマーシャリングする別ObservableCollection
のサブクラスを使用しようとしましたが、毎回同じエラーが発生します
「タイプ 'System.StackOverflowException' の未処理の例外が不明なモジュールで発生しました。」
トラブルシューティングのヒントは次のとおりです。
無限ループや無限再帰がないことを確認してください。
BlockingQueue
1 秒あたり 5 から 10 のように、常に新しい要素を受信しているため、実際にはある種の無限ループがあります。ただし、コントロールをにバインドしない場合、または代わりにリストを使用する場合
、例外は発生しません。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);
}
}
}
編集バグを追跡していると、バグは自然に消えました。問題がどこにあるのかを本当に理解するために、物事を単純化しようとしていましたが、それが機能し始めました. 物事を元に戻すと、まだ機能します...しかし、リストビューにスタイルを追加するなどの無関係な理由で、時々戻ってきます。サードパーティの dll に問題があるのではないかと考え始めています。