Я предполагаю, что у вас есть что-то, созданное в одном потоке, и вы пытаетесь обновить это из другого потока, а WPF этого не позволяет.Объекты могут быть изменены только из потока, в котором они были созданы.
Обычно все объекты создаются в основном потоке пользовательского интерфейса, а диспетчер используется для передачи асинхронных сообщений в поток пользовательского интерфейса для обновления этих объектов.Любую тяжелую обработку все еще можно выполнить в фоновом потоке, однако для обновления свойства объекта вам необходимо использовать основной поток пользовательского интерфейса.
Например, что-то, что выглядит так, будет работать:
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>;
}
Вот еще один пример, который работает, поскольку он отправляет сообщение для обновления объекта в поток пользовательского интерфейса, который создал объект.
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;
}));
}