2011-06-21 30 views
1

我有一個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交互的信息。如果有人有資源可能有助於澄清情況,那麼我會非常感謝這個鏈接。

回答

2

如果這兩個在UI線程上調用/設置,它應該沒問題。

我懷疑是你錯誤地使用了BeginInvokeDispatcher.CurrentDispatcherDispatcher爲「當前正在執行的線程」,而不是 UI線程的分派器。您很可能需要將其更改爲Application.Current.Dispatcher.BeginInvoke(與當前應用程序關聯的Dispatcher)或某個UIElement的Dispatcher。