我有一個WPF GUI,可能每天拋出一個特定的錯誤。C#/ WPF - CurrentDispatcher和DispatchTimer - 非常不頻繁併發修改exeception
「Collection was modified after the enumerator was Instantiated"
它所指的特定集合是TimeStamps字典。 'dict'是一個私有成員變量。
dict = new Dictionary<string, List<DateTime>>();
有其中收集引用兩個地方,都應該僅被分派線程上調用。所述第一位置是用於添加到詞典,並且當一個ViewModel特定的DependencyProperty改變被調用時,
void CalledFromDispatch(Item i)
{
dict[i.Category].Add(DateTime.UtcNow);
}
的第二位是我從字典中讀出。傑出的是布爾依賴屬性。
void PeriodicUpdate()
{
HasOutstanding = dict["New"].Any();
}
分配給HasOutstanding
是在異常被拋出,我知道我可以使用Count > 0
來解決這個問題,但我擔心的例外是可能的。
第一段代碼實際上就是這樣調用的;
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.DataBind,() => CalledFromDispatch(i));
第二個是這樣安排的;
DispatcherTimer DispatcherTimer = new DispatcherTimer(DispatcherPriority.DataBind)
DispatcherTimer.Interval = TimeSpan.FromSeconds(1);
DispatcherTimer.Start();
...
DispatcherTimer.Tick += (s, e) => PeriodicUpdate();
所以我的問題歸結爲;
- DispatchTimer是否使用與CurrentDispatcher相同的線程?
- 如果是這樣,分派器可能會在執行中執行預定的操作嗎?
否則我不知道這是怎麼發生的。
我真的很想了解更多關於DispatchTimer如何與CurrentDispatcher交互的信息。如果有人有資源可能有助於澄清情況,那麼我會非常感謝這個鏈接。