这是对此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;
答案 0 :(得分:1)
您可以使用mainWindow.Dispatcher.Invoke
而不是尝试转换为ISynchronizeInvoke
。 Dispatcher.Invoke将为WPF提供正确的编组。
请注意,.NET 4.5增加了WPF通过设置BindingOperations.EnableCollectionSynchronization自动处理此功能的功能。
答案 1 :(得分:0)
您应该查看一些ThreadSafeObservableCollection实现中的一些。这些将很好地解决从后台线程更新ObservableCollection的问题!