gpt4 book ai didi

wpf - 调用线程无法访问此对象,因为另一个线程拥有它 wpf

转载 作者:行者123 更新时间:2023-12-03 13:15:04 26 4
gpt4 key购买 nike

我是线程概念的新手。

我检查了具有相同内容的问题,但与我当前的问题无关,即

我在 UI 中有一个文本框绑定(bind)到 MyViewModel.cs 中的 GridSize
当网格大小发生变化时,更新 UI 组件会导致应用程序卡住,因此我尝试使用 TPL Task.Factory.StartNew() 进行大量计算。

这给了我错误“调用线程无法访问此对象,因为不同的线程拥有”

我正在使用 MEF 导入 ViewModel。

Xaml.cs 文件

[Import]
public MyViewModel ViewModel
{
get { return DataContext as MyViewModel; }
set
{
if (DataContext is MyViewModel)
ViewModel.OnModelUpdated -= ModelUpdatedEvent;

DataContext = value;

if (DataContext is MyViewModel)
{
ViewModel.OnModelUpdated += ModelUpdatedEvent;
}
}
}

private void ModelUpdatedEvent(object sender, EventArgs e)
{
// code to update the UI.
}

MyViewModel.cs
public double GridSize
{
get { return _settings.GridSize; }
set
{
_settings.GridSize = value;

ModelUpdatedEvent();
}
}

public event EventHandler OnModelUpdated;

public void ModelUpdatedEvent()
{
EventHandler eventModelUpdated = OnModelUpdated;
if (eventModelUpdated != null)
{
Task.Factory.StartNew(()=> eventModelUpdated.Invoke(this, EventArgs.Empty));
}
}

任何帮助深表感谢。

最佳答案

WPF 可视对象只能由创建它们的线程操作。 TPL 通过使用其他线程并行执行事物。

您可以使用 Dispatcher.BeginInvoke() 将计算结果编码回正确的线程。 :

Application.Current.Dispatcher.BeginInvoke(new Action(() => this.GridSize = calculatedGridSize));

根据您的评论。如果您的阻塞计算在 View 中,那么您仍然需要将这些计算卸载到后面代码中的另一个线程。您需要从实际触及 View 项的代码中分离出实际计算。计算完成后,您需要以上述方式编码对可视项目的任何调用。

关于wpf - 调用线程无法访问此对象,因为另一个线程拥有它 wpf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22452478/

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