2010-12-01 2 views

답변

5

GUI 컨텍스트를 구성하는 것이 항상 명확하지 않기 때문에 100 % 정확도로이 질문에 대답하기가 어렵습니다. 그것은 예/아니오 답보다 경험적입니다. GUI는 모든 GUI 프레임 워크마다 다릅니다.

는 WPF를 들어 좋은 그냥 무작위 스레드에 Dispatcher을 설정하지만, 실제로는 참을 수 없어 속지 할 수있는 현재의 thread 그러나이

public static bool IsWpfGuiThread() { 
    return Dispatcher.FromThread(Thread.CurrentThread) != null; 
} 

에 대한 활성 Dispatcher로 확인이 있는지 확인하는 것입니다 그 위에 GUI가 있습니다.

WinForms의 경우 현재 확인해야 할 것이 현재 SynchronizationContext입니다.

public static bool IsWinFormsGuiThread() { 
    return SynchronizationContext.Current is WindowsFormsSynchronizationContext; 
} 

그러나 이것은 다른 동기 콘텍스트에 Current 값 재설정 일시적 사람 속지 (또는 그 이상) 할 수있다. 이것은 본질적으로 단지 글로벌 스레드이며 누구든지 설정할 수 있습니다. 실제로 Visual Studio와 같은 특정 응용 프로그램에서 변경하는 것이 일반적입니다 (그러나 WPF 응용 프로그램 임).

+0

나는 이것이 이전 답변이지만, WPF 응용 프로그램에 여러 UI 스레드가있을 수 있으며, [Dispatcher.FromThread()] (https : // msdn)을 사용하여 현재 스레드에서 활성 디스패처를 확인 할 수 있습니다. microsoft.com/en-us/library/system.windows.threading.dispatcher.fromthread(v=vs.110).aspx)는 UI 스레드 (또는 "the") 인 좋은 지표가 아닙니다. 이를 처리하는 가장 좋은 방법 중 하나는 장기 실행 또는 백그라운드 스레드를 시작하는 스레드의 SynchronizationContext를 추적하는 것입니다.이 단계는 비동기/대기가 도움이 될 수있는 곳입니다.이 대답이 처음 작성되었을 때 존재하지는 않습니다. – slugster

1

알려진 GUI 개체를 사용하고 있는지 여부를 묻는 질문을 통해 올바른 컨텍스트에 있는지 확인할 수 있습니까? 그 물건? 나는 이것을 위해 guiObject.VerifyAccess()이 작동 할 것이라고 생각한다.

관련 문제