2012-01-26 34 views
2

我有一個線程安全的可觀察集合替換,我想爲它編寫一個單元測試。爲了避免誤報,我試圖編寫一個多線程測試,證明一個對象無法添加到ObservableCollection>中,因此我可以將其與我的交換,並看它變綠。我無法讓這個測試失敗(使用NUnit)。如何編寫ObservableCollections的線程親和性的失敗測試

沒有特定的順序我試過到目前爲止:

  • 在不同的線程創建的收集和更新當前
  • 創建當前線程的收集和更新上的備用
  • 使用不同的線程機制
    • 的ThreadStart
    • 調度
    • BackgroundWorker的
  • 使用不同的公寓指出
    • STA和MTA的所有組合在測試本身和/或一個或兩個線程
  • 創建一個WPF窗口來收集和手動操作分派器框架以模擬運行時環境。

自定義集合本身在實際代碼中工作正常,所以現在更多的是學術活動而不是任何事情;我穿的信心已經動搖:)

+1

您是否試圖讓標準可觀察性在多線程場景中失敗? – 2012-01-26 23:04:59

回答

4

你想測試的東西,是不是有...

沒有理由爲這個測試失敗,因爲ObservableCollection<T>類本身沒有線程親和力。它不是線程安全的,但它意味着如果您在沒有正確鎖定的情況下在多線程場景中使用它,這種行爲將是不可預測的; ObservableCollection<T>中沒有任何內容會顯式拋出異常,如果你這樣做。

然而,CollectionView確實有螺紋的親和力,這就是爲什麼你不能從項目不同的線程添加到ObservableCollection<T>是否有連接到它(發生,例如一個CollectionView,當您將ItemsControl綁定到集合)。但它是拋出一個異常,而不是ObservableCollection<T>CollectionView ...

看看下面的代碼:

var list = new ObservableCollection<string>(); 
// var view = CollectionViewSource.GetDefaultView(list); 
ThreadPool.QueueUserWorkItem(_ => list.Add("foo")); 

它的執行沒有拋出異常,但如果你取消註釋行創建CollectionView,它將拋出一個NotSupportedException

這種類型的CollectionView不支持從一個線程從調度線程不同其 SourceCollection變化。

+0

啊......這清除了一些東西,謝謝。我接受了這個答案,因爲它提供了一種獲得我期望的行爲的途徑(無論是否有效),以及對真正發生的事情的極好解釋。 – JRoughan 2012-01-27 01:08:42

相關問題