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

这是本课题的后续行动。

我必须从不同的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调用它会导致exception:“这种类型的CollectionView不支持从与Dispatcher线程不同的线程更改其SourceCollection。”

问题是ISynchronize Invoke似乎不适用于wpf? 有一个编译器错误消息,即mainWindow无法转换为ISynchronizeInvoke。

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

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

请注意,.NET 4.5通过设置BindingOperations.EnableCollectionSynchronization为WPF添加了自动处理此function的function 。

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