2011-06-21 12 views
1

私はたぶん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とどのようにやりとりするかについてもっと知りたいです。誰かが状況を明確にするのに役立つリソースを持っているなら、私はリンクを大いに感謝します。

答えて

2

これらの両方がUIスレッドで/ setupと呼ばれていれば、それは問題ありません。

BeginInvokeを間違って使用している可能性があります。 Dispatcher.CurrentDispatcherは、「現在実行中のスレッド」の場合はDispatcherの場合はUIスレッドのDispatcherではではありません。おそらく、これをApplication.Current.Dispatcher.BeginInvoke(現在のアプリケーションに関連付けられたディスパッチャ)または一部のUIElementのディスパッチャに変更する必要があります。

関連する問題