메소드가 UI 스레드에서 실행되는지 여부를 분리하는 방식으로 어떻게 알 수 있습니까?

StackOverflow https://stackoverflow.com/questions/907166

  •  05-09-2019
  •  | 
  •  

문제

여기에 문제가 있습니다. UI 스레드에서 개체가 인스턴스화되어 있는지 확인해야합니다. 그렇지 않은 경우 예외를 던져야합니다. 그러나 UI 스레드에서 실행중인 메소드 내부에서 어떻게 확인합니까? 참고 : 정보를 객체의 생성자로 전달하고 싶지 않습니다.

도움이 되었습니까?

해결책

작은 설명이지만 일반적으로 1 개의 UI 스레드 만 있지만 많은 UI 스레드가있을 수 있습니다. 이것은 WPF와 WinForms 모두에 해당됩니다.

내가 이것을 달성하는 가장 좋은 방법은 동기화 콘텍스트를 사용하는 것입니다. WPF와 WinForms는 모두 UI를 실행중인 스레드에서 동기화 콘텍스트를 설정합니다. 이것은 특정 UI 모델에 연결되지 않은 경우 사용하는 기능입니다.

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

어떠한 방식으로도 완벽하지 않습니다. 비 UI 구성 요소가 동기화 콘텍스트를 설정할 수 있으며 이는 간단한 작업자 스레드의 경우 TRUE를 반환합니다. 따라서 비 승인 이름입니다.

약간 이를 수행하는보다 안정적인 방법은 다음과 같습니다. 그러나 구현하려면 WPF의 적어도 일부를 참조해야합니다.

public bool IsLikelyWpfUIThread() {
  var context = SynchronizationContext.Current;
  return context != null && context is DispatcherSynchronizationContext;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top