2011-08-24 8 views
1

여기에서 여러 게시물을 읽었으며 Google의 참고 자료를 통해 읽었지만 적절한 해결책을 찾지 못했습니다.메인 애플리케이션의 스레드 ID 받기

대화 상자를 표시하는 어셈블리가 있지만 해당 대화 상자가 주 스레드에서 표시되어야합니다. 호출자는 .NET 응용 프로그램 또는 기본 응용 프로그램 일 수 있습니다.

개념적으로, 단순히 응용 프로그램의 주 스레드 ID를 얻은 다음 System.Windows.Threading.Dispatcher.FromThread(main_thread_id_here)을 호출하여 Dispatcher를 얻은 다음 Invoke을 호출하여 주 스레드의 대화 상자를 표시하십시오. 그러나, 나는 주 스레드 ID를 얻는 방법을 알아낼 수 없었다.

내 다음 접근 방식은 (다른 SO 질문의 조언을 따르고) Process.GetCurrentProcess().Threads을 반복하고 처음에 시작된 ProcessThread의 스레드 ID를 얻습니다. 하지만 이제는이 ProcessThread을 가지고 있으므로 해당 Thread 개체를 가져올 방법이 없습니다. 나는 현재 실행중인 모든 .NET 쓰레드 목록을 현재 프로세스에서 얻을 수 있고 어떤 스레드가 주 스레드인지 결정하기 위해 GetHashCode을 통해 쓰레드 ID를 비교할 수 있다고 생각했다. 그런 다음 FromThread을 사용하여 Dispatcher을 얻을 수는 있지만 아무 것도 검색하는 데는 아무 정보도 찾을 수 없었습니다. ProcessThreads!

누구나 위에서 설명한 방법을 사용하거나 다른 접근 방법을 사용하여이 문제를 해결하는 방법에 대한 정보를 얻을 수 있습니까? 호출 응용 프로그램을 제어 할 수는 없습니다.

답변

2
Application.Current.Dispatcher.BeginInvoke(new Action(() => 
{ 
    // Show dialog 
})); 

또한 Window.Dispatcher 호텔에서 디스패처를 잡을 수 있습니다.

+0

나는 이전에 이것을 시도해 보았습니다. Dispatcher.CurrentDispatcher가 반드시 주 스레드를 제공하지는 않기 때문에 작동하지 않습니다. 아주 잘 당신에게 작업 스레드를 줄 수 있습니다. IIRC에서 아직 Dispatcher가없는 스레드에서 Dispatcher를 요청하면 자동으로 작성되어 리턴됩니다. – Dave

+0

게시물을'Application.Current.Dispatcher'로 업데이트했습니다. 이 방법은 나를 위해 일합니다. 나는 원래 다른 방식을 기억하고 있었다. 여전히 어떤 이유로 든 작동하지 않는다면,'Window's 중 하나에서 Dispatcher 오브젝트를 가져올 수 있습니다. – RandomEngy

+0

정말 멋지다. 내 .NET 테스트 앱에서 작동한다. 벙어리 질문 - 발신자가 기본 앱인 경우에도 똑같이 작동합니까? – Dave

관련 문제