2009-05-25 4 views
5

다음과 같은 문제가 있습니다. 개체가 UI 스레드에서 인스턴스화되었는지 확인해야합니다. 그렇지 않은 경우 예외가 throw됩니다. 하지만 UI 스레드에서 실행 중인지 여부를 확인하려면 어떻게해야합니까? 참고 : 객체의 생성자에 정보를 전달하고 싶지 않습니다.메서드가 UI 스레드에서 실행되는지 여부를 어떻게 알 수 있습니까?

DispatcherSynchronizationContext (SynchronizationContext의 WPF 구현)는 연결된 스레드를 참조하는 Dispatcher에 대한 참조를 내부적으로 보유하는 완벽한 후보가 될 수 있지만 불행히도이 필드는 개인용이므로 액세스 할 방법이 없습니다.

답변

8

일반적으로 UI 스레드가 하나 밖에 없지만 UI 스레드가 많을 수는 있습니다. 이는 WPF와 WinForms 모두에 해당됩니다.

내가 달성 한 가장 좋은 방법은 SynchronizationContext를 사용하는 것입니다. WPF와 WinForms는 UI를 실행중인 모든 스레드에서 SynchronizationContext를 설정합니다. 특정 UI 모델에 묶여 있지 않은 경우 사용하는 함수입니다.

public bool IsPossiblyUIThread() { 
    return SynchronizationContext.Current != null; 
} 

참고로 어떤 방식 으로든 완벽하지는 않습니다. 비 UI 구성 요소가 SynchronizationContext를 설정하는 것이 가능하며 이는 간단한 작업자 스레드에 대해 true를 반환합니다. 그러므로 비 권위적인 이름.

약간 이렇게하는 더 신뢰할 수있는 방법은 다음과 같습니다. 그러나 구현하려면 최소한 WPF의 일부를 참조해야합니다. 코드가 디스패처와 같은 스레드에서 실행되는 경우

public bool IsLikelyWpfUIThread() { 
    var context = SynchronizationContext.Current; 
    return context != null && context is DispatcherSynchronizationContext; 
} 
+0

네, 이것이 가장 좋은 방법 인 것 같습니다. 정말 고마워! –

2

Dispatcher.CheckAccess() true를 반환합니다. Dispatcher/UIThread가 하나만있는 경우 작동합니다.

+1

이것은 사실 일 수 있지만 Dispatcher는 항상 작성된 스레드와 연관되어 있습니다. Dispatcher.CheckAccess()를 사용하면 다른 스레드에서 객체를 만든 경우 많은 도움이되지 않습니다. –

관련 문제