私はたぶん1日に一度特定のエラーをスローするWPF GUIを持っています。C#/ WPF - CurrentDispatcherとDispatchTimer - 非常にまれな同時並行変更の例外
“Collection was modified after the enumerator was Instantiated"
特定のコレクションは、TimeStampsの辞書です。 'dict'はプライベートメンバー変数です。
dict = new Dictionary<string, List<DateTime>>();
コレクションが参照された二つの場所がありますが、両方はのみディスパッチスレッドで呼び出されなければなりません。最初の場所は、私は辞書から読み出した場合
void CalledFromDispatch(Item i)
{
dict[i.Category].Add(DateTime.UtcNow);
}
二位であり、辞書に追加するためのものであり、ビューモデル上の特定のDependencyPropertyが変化したときに呼び出されます。優れているのはブール依存性プロパティです。
void PeriodicUpdate()
{
HasOutstanding = dict["New"].Any();
}
HasOutstanding
への割り当ては、例外がスローされた場合、私は問題を解決するためにCount > 0
を使用することができます知っているが、それは例外が可能であることを私に心配します。
最初のコードは実際にはこのように呼び出されます。
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.DataBind,() => CalledFromDispatch(i));
2番目はこのようにスケジュールされています。
DispatcherTimer DispatcherTimer = new DispatcherTimer(DispatcherPriority.DataBind)
DispatcherTimer.Interval = TimeSpan.FromSeconds(1);
DispatcherTimer.Start();
...
DispatcherTimer.Tick += (s, e) => PeriodicUpdate();
ですから、私の質問は沸騰します。
- DispatchTimerはCurrentDispatcherと同じスレッドを使用しますか?
- もしそうなら、Dispatcherが実行中にスケジュールされた操作を切り替える可能性はありますか?
そうでなければ、これはどのように発生するのかわかりません。
DispatchTimerがCurrentDispatcherとどのようにやりとりするかについてもっと知りたいです。誰かが状況を明確にするのに役立つリソースを持っているなら、私はリンクを大いに感謝します。