切换到WPF中的调度程序线程

时间:2012-07-30 16:03:33

标签: c# wpf multithreading

这是对此Question的跟进。

我必须从不同的Thread更新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中,并调用native c Code。

setNewDataLine位于mainWindow上,并为Observable Collection添加了一行。

如果从另一个Thread调用它会导致异常: “这种类型的CollectionView不支持从与Dispatcher线程不同的线程更改其SourceCollection。”

问题是ISynchronize Invoke似乎不适用于wpf?发生编译器错误消息,指出mainWindow无法转换为ISynchronizeInvoke。

如果我使用 ISynchronizeInvoke target = mainWindow as ISynchronizeInvoke; 它可以编译,但target为null;

2 个答案:

答案 0 :(得分:1)

您可以使用mainWindow.Dispatcher.Invoke而不是尝试转换为ISynchronizeInvokeDispatcher.Invoke将为WPF提供正确的编组。

请注意,.NET 4.5增加了WPF通过设置BindingOperations.EnableCollectionSynchronization自动处理此功能的功能。

答案 1 :(得分:0)

您应该查看一些ThreadSafeObservableCollection实现中的一些。这些将很好地解决从后台线程更新ObservableCollection的问题!