2012-07-30 103 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;它可以编译但目标为空;

回答