切换到WPF中的调度程序线程
问题描述:
这是此后的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;它可以编译但目标为空;
答
您可以使用mainWindow.Dispatcher.Invoke
而不是尝试投射到ISynchronizeInvoke
。 Dispatcher.Invoke将为WPF提供正确的封送处理。
请注意,.NET 4.5增加了WPF通过设置BindingOperations.EnableCollectionSynchronization自动处理这个问题的能力。
精彩,它的工作,谢谢 – user1550097 2012-07-30 16:50:46
标记为回答比.. – Darek 2012-07-30 17:24:37