2010-05-13 41 views
4

我有以下代碼修改每當用戶離開時可觀察的'屏幕'集合。WPF:從調度程序修改CollectionView仍然會拋出錯誤

void OnUserLeft(int roomId, int userId, string username) 
    { 
     client.ClientDispatcher.Invoke(
      (Action<int>)((id) => 
      { 
       Console.WriteLine("Hello before the storm!"); 
       var screensToCheck = client.Screens.Where(s => s.CpuId == id).ToList(); 
       screensToCheck.Each(s => client.Screens.Remove(s)); 
       Console.WriteLine("Hello there!"); 
      }), userId); 
    } 

這是封裝在一個調用客戶端的調度程序,據說是通過與CollectionViews有關的線程問題。但是,我仍然會遇到以下例外情況:

此類CollectionView不支持從與分派器線程不同的線程更改其SourceCollection。

分派以上你看到的是在WPF應用程序的MainViewModel設置(我們使用MVVM),像這樣:

public Dispatcher ClientDispatcher 
{ 
    get { return Dispatcher.CurrentDispatcher; } 
} 
+0

什麼是「客戶調度員」? – Jon 2010-05-13 21:48:25

+0

對不起,在這個問題上添加了一些關於'ClientDispatcher'的信息。 – Dusda 2010-05-13 21:51:53

回答

6

CurrentDispatcher文檔:

獲取當前正在執行的線程的調度程序,並創建一個新的Dispatcher(如果尚未與線程關聯)。

它看起來像您正在訪問CurrentDispatcher而不是在你的UI線程,並在其上調用你的操作(即調用沒有效果,因爲在所有的線程你是在沒有調度;當場創建了一個新的電話,然後通話進行)。

,你創建Client情況下,你應該節省的Dispatcher.CurrentDispatcher在該點的值(假設你正在做的是從UI線程內),例如:

class Client { 
    Client() { 
     this.OwningDispatcher = Dispatcher.CurrentDispatcher; 
    } 

    Dispatcher OwningDispatcher { get; private set; } 
} 

如果您Client實例不是在UI線程上創建,你需要一些方法來獲得Dispatcher的正確值。

+0

這是我們第一次嘗試使用Dispatcher來刪除某些內容。所以你說我們的調度程序可能沒有正確實施?我現在就試試看。 – Dusda 2010-05-13 21:54:30

+0

成功!你先生,很棒。 – Dusda 2010-05-13 22:03:16

+0

我不會稱這是輝煌的結果。我只是仔細閱讀代碼使用的功能文檔。 :-) – Jon 2010-05-13 22:13:21

相關問題