한 스레드에서 생성 된 내용을 다른 스레드에서 업데이트하려고 시도하고 WPF가이를 허용하지 않는다고 생각합니다. 객체는 생성 된 스레드에서만 수정할 수 있습니다.
일반적으로 모든 객체는 기본 UI 스레드에서 생성되고 디스패처는 이러한 객체를 업데이트하기 위해 비동기 메시지를 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;
}));
}
당신의 노력에 감사드립니다, 레이첼,하지만 이미이 접근법을 시도했습니다. Dispatcher.CurrentDispatcher.Invoke가 작동하지 않습니다. 나는 Bas B의 대답에 대한 논평으로 그것을 썼다. –
@ Bogdan0x400 죄송합니다. 구문이 잘못되었습니다. 'Dispatcher.CurrentDispatcher'는 현재 쓰레드의 디스패처를 리턴합니다. 따라서 백그라운드 쓰레드에서 호출하면 백그라운드 쓰레드에 대한 디스패처를 반환합니다. UI 스레드에 대한 디스패처를 얻으려면 thead UI에서 호출하거나 "Application.Current.Dispatcher"와 같은 것을 사용해야합니다. 'App.Current.Dispatcher'는 WPF 프로젝트의 시작 응용 프로그램이 기본적으로'App'라고하기 때문에 일반적으로 나타나는 문법입니다. ''이 다른 것으로 불리는 경우 대신 사용해야합니다. –
Rachel