gpt4 book ai didi

wpf - NotificationObject 的调度程序

转载 作者:行者123 更新时间:2023-12-03 10:21:53 24 4
gpt4 key购买 nike

我有 2 个充当 View 模型的 NotificationObject 对象。第一个 NotificationObject 包含绑定(bind)到特定控件 View 的属性,第二个 NotificationObject 包含一些使用 Thread 对象在另一个线程中执行的代码。我需要从第二个 NotificationObject 的运行代码更改第一个 NotificationObject 的属性。当我尝试这样做时,出现异常“调用线程无法访问此对象,因为不同的线程拥有它。”。

我认为我需要使用某种调度程序来访问这些属性,就像我在 Windows 窗体或经典 WPF 中所做的那样,但我无法在 Prism MVVM 中找到如何做到这一点。那么如何更改第一个 NotificationObject 的属性呢?

最佳答案

我猜你在一个线程上创建了一些东西,并试图从另一个线程更新它,而 WPF 不允许这样做。对象只能从创建它们的线程中修改。

通常所有对象都在主 UI 线程上创建,而 Dispatcher 用于将异步消息传递给 UI 线程以更新这些对象。任何繁重的处理仍然可以在后台线程上完成,但是要更新对象的属性,您需要使用主 UI 线程。

例如,看起来像这样的东西会起作用:

MyNotificationObject obj = new MyNotificationObject;
obj.Items = MethodThatRunsOnBackgroundThread();

List<SomeObject> MethodThatRunsOnBackgroundThread()
{
var list = new List<SomeObject>();
// Do Work
Return list;
}

虽然这不会:
MyNotificationObject obj = new MyNotificationObject;
MethodThatRunsOnBackgroundThread(obj);

void MethodThatRunsOnBackgroundThread()
{
var list = new List<SomeObject>();
// Do Work

// This won't work since obj was created on UI thread
obj.Items = List<SomeObject>;
}

这是另一个有效的示例,因为它正在向创建对象的 UI 线程发送更新对象的消息。
MyNotificationObject obj = new MyNotificationObject;
MethodThatRunsOnBackgroundThread(obj);

void MethodThatRunsOnBackgroundThread()
{
var list = new List<SomeObject>();

// Load List

Application.Current.Dispatcher.BeginInvoke(DispatherPriority.Background,
new Action(delegate {
obj.Items = list;
}));
}

关于wpf - NotificationObject 的调度程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8757442/

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