2009-07-19 2 views
13

인수를 위해 UI 스레드는 Application.Run()에 대한 호출이 있거나 해당 호출 중 하나가 호출되어 활성 메시지 루프가 실행중인 스레드로 간주합니다.UI 스레드에 있는지 확인하는 방법은 무엇입니까?

현재 해당 스레드에서 실행 중인지 여부를 감지하는 방법이 있습니까?

내가 원한 이유는 장기 실행 개인 기능을 가진 클래스가 있기 때문입니다. 클래스 자체는 이미 멀티 스레드되어 있으며,이 클래스의 사용법은 UI 나 처리를 수행하는 백그라운드 스레드에서 사용될 수 있습니다. 이 함수는 또한이 네트에 들어갑니다. 그러나 UI 스레드를 막지 않기를 바랍니다. 그래서 UI 스레드에서 실행 중인지 감지하고 싶은 경우 함수 호출을 백그라운드 스레드로 포크 (아마도 ThreadPool,하지만이 토론에 대해서는 비공개)합니다. 이것은 전적으로 잘 동작하지만 백그라운드 스레드는 아마도 함수의 출력에 의존하고 있으므로 UI ​​스레드가 더 "set-and-forget"방식으로 액세스하는 반면 UI 스레드가이를 차단하는 것이 좋습니다.

답변

7

참조하십시오. 래퍼 메서드를 사용하여 쉽게 만들 수 있습니다. 그러나 이는 "이상한"상황 (예 : 모름을주는 UI 프레임 워크 또는 이벤트 루프가있는 다른 것)에서 호출자가 문제가되지 않는다는 것을 의미합니다.) 그리고 당신은 그들에게 잘못된 결정을 내린다.

메서드가 올바른 스레드에서 피드백을 제공해야하는 경우 UI가이 방법으로 수행하기 위해 ISynchronizeInvoke (Control 구현)을 전달합니다.

12

Form 또는 Control에 액세스 할 수있는 경우 InvokeRequired 속성을 확인할 수 있습니다. UI 스레드를 사용하고 있다면 false을, 그렇지 않은 경우 true을 반환 할 것입니다. Control을 확인할 수없는 컨텍스트에서 발생하면 검사 할 수있는 정적 속성을 쉽게 설정할 수 있습니다. 시작시 Thread.CurrentThread에 대한 참조를 저장하고, 당신이 알아야 할 때 참조에 Thread.CurrentThread 비교 : 당신이 아닌지 Program.IsRunningOnStartupThread를 호출하여

static class Program 
{ 
    private static Thread _startupThread = null; 

    [STAThread] 
    static void Main() 
    { 
     _startupThread = Thread.CurrentThread; 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 

    public static bool IsRunningOnStartupThread() 
    { 
     return Thread.CurrentThread == _startupThread; 
    } 
} 

당신이 bool 말을 얻을 것이다.

+0

startupthread는 반드시 GUI 스레드 또는 GUI 스레드 일 필요는 없습니다. –

+1

WRONG : InvokeRequired는 "컨트롤이 만들어진 스레드와 다른 스레드"인 경우 true를 반환합니다. –

+1

@Rico : 예, 물론입니다. 오타가 지난 3 년간 아무도 눈치 채지 못했다고 나는 믿을 수 없다. 그것을 잡아 주셔서 감사합니다, 나는 그에 따라 답변을 업데이 트했습니다. –

8

bool isMessageLoopThread = System.Windows.Forms.Application.MessageLoop;

+0

이것은 내 용도에 대한 가장 간단한 대답입니다. – ToolmakerSteve