문제

WPF 응용 프로그램에는 객체를 생성하는 BackgroundWorker 스레드가 있었습니다.객체를 foo라고 부르자.

백그라운드 작업자 코드:

SomeClass foo = new SomeClass();
// Do some operation on foo

// Set some dependency property on the main class to foo
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
    (SendOrPostCallback)delegate { SetValue(FooProperty, foo); },
    foo);

이제 메인 클래스가 getter를 사용하여 FooProperty에 액세스하려고 하면 InvalidOperationException이 발생합니다.다른 스레드가 이 개체를 소유하고 있으므로 호출 스레드는 이 개체에 액세스할 수 없습니다.

개체를 생성하는 스레드가 완료되었음에도 여전히 개체를 소유하고 있는 이유는 무엇입니까?이 주변에 어딘가가 있나요?

도움이 되었습니까?

해결책

주어진 스레드에서 만든 객체는 해당 스레드가 소유합니다. 그렇기 때문에 유효하지 않은 이유입니다. 배경 스레드에 속성을 설정하려면 대의원이 원하는 값을 반환하고 기본 스레드에서 setValue를 호출하는 것이 좋습니다. (객체를 만든 스레드).

다른 팁

WPF의 대부분의 물체에는 스레드 친화력이 있습니다. 그것은 한 번 특정 스레드에서 생성되며 WPF 객체는 해당 스레드에서 사용될 때만 작동합니다. 이 제한은 해당 객체에서 실제로 수행하는 모든 작업에 대해 (winforms와 달리) 시행됩니다.

이 시나리오의 실제 UI 스레드에서 foo를 만들려면 코드를 변경해야합니다.

가정 SomeClass 에서 파생됩니다 DispatcherObject, 이를 생성한 스레드는 다음에 대한 메시지 처리를 담당하는 메시지 펌프를 실행합니다. foo 물체.따라서 해당 스레드가 종료되면 개체는 더 이상 메시지를 처리할 수 없으며 이는 좋은 생각이 아닙니다.

대부분의 상황에서는 동일한 UI 스레드를 사용하여 모든 UI 개체(또는 다음에서 파생된 다른 항목)를 만들어야 합니다. DispatcherObject 애플리케이션이 실행되는 동안 실행되는지 확인하세요.그런 다음 Dispatcher 작업자 스레드에서 메시지를 보냅니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top