gpt4 book ai didi

c# - 切换到 WPF 中的调度程序线程

转载 作者:行者123 更新时间:2023-11-30 17:58:55 24 4
gpt4 key购买 nike

这是此 Question 的跟进.

我必须从不同的线程更新 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 代码。

setNewDataLine 在 mainWindow 上并向 Observable 集合添加一条线。

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

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

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

最佳答案

您可以只使用 mainWindow.Dispatcher.Invoke 而不是尝试转换为 ISynchronizeInvokeDispatcher.Invoke将为 WPF 提供正确的编码(marshal)处理。

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

关于c# - 切换到 WPF 中的调度程序线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11725191/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com