2012-07-30 104 views
3

這是此後的Question切換到WPF中的調度程序線程

我必須從一個不同的線程更新一個ObservableCollection。我用下面的代碼試了一下:

  Thread t = new Thread(()=> 
     { 
      while(true) 
      { 

       if (ErrorDetection.ErrorDetectionIO.doErrorDetection() == 1) 
       { 
        dataLine = ErrorDetection.ErrorDetectionIO.getDataLine(); 

        if (mainWindow != null) 
        { 
         ISynchronizeInvoke target = mainWindow; // mainWindow needs to be an WindowsForm? 
         target.Invoke(
          (Action)(() => 
          { 
           mainWindow.setNewDataLine(dataLine); 
          } 
          ), null); 
        } 

       } 
      } 

     } ); 

     t.IsBackground = true; 
     t.Start(); 

ErrorDetectionIO.doErrorDetection()是在C++/CLI .dll和調用本地C代碼。

setNewDataLine位於mainWindow上,並將一個Line添加到Observable集合中。

如果從不同線程調用它,則會導致異常: 「此類CollectionView不支持從與分派器線程不同的線程更改其SourceCollection。」

問題是ISynchronize Invoke似乎不適用於wpf? Threres編譯器錯誤消息,說明mainWindow不能轉換爲ISynchronizeInvoke。

如果我使用 ISynchronizeInvoke target = mainWindow as ISynchronizeInvoke;它可以編譯但目標爲空;

回答