문제

논쟁을 위해 UI 스레드를 전화 한 스레드로 간주하십시오. Application.Run() 또는 그 중 하나가 호출 된 오버로드이며 활성 메시지 루프가 실행됩니다.

현재 그러한 스레드에서 실행중인 경우 감지 방법이 있습니까?

내가 원하는 이유는 장기적으로 실행되는 개인 기능이있는 수업이 있기 때문입니다. 클래스 자체는 이미 멀티 스레드가 있으며이 클래스의 사용은 UI 또는 처리를 수행하는 배경 스레드에서 사용될 수 있습니다. 이 기능은 또한이 그물에 속합니다. 그러나 나는 그것이 UI 스레드를 차단하는 것을 원하지 않습니다. 그래서 UI 스레드에서 실행 중인지 감지하고 있다면 기능 호출을 배경 스레드로 포크합니다 (아마도 ThreadPool, 그러나 그것은이 토론의 문제가 아닌 것입니다). 이것은 전적으로 잘 행동하지만 배경 스레드는 아마도 함수의 출력에 의존 할 수 있으므로 블로킹이 더 좋지만 UI 스레드는 더 "설정 및 포 게트"방식으로 액세스하는 것이 좋습니다.

도움이 되었습니까?

해결책

나는 그것이 발신자가 내려야 할 결정의 종류라고 제안합니다. 당신은 항상 래퍼 방법을 작성하기 위해 래퍼 방법을 작성할 수 있습니다. 그러나 발신자가 "홀수"상황에있는 데 문제가 없다는 것을 의미합니다 (예 : 당신이 모르는 UI 프레임 워크 또는 이벤트 루프가있는 다른 것 ) 그리고 당신은 그들에게 잘못된 결정을 내립니다.

이 방법이 올바른 스레드에서 피드백을 제공해야한다면 ISynchronizeInvoke (구현 Control) UI-Agnostic 방식으로 그렇게합니다.

다른 팁

A에 액세스 할 수있는 경우 Form 또는 a Control, 당신은 그것을 확인할 수 있습니다 InvokeRequired 재산; 이것은 돌아올 것입니다 false UI 스레드에있는 경우 true 당신이 아닌 경우 .. 그것이 당신이 Control, 당신은 당신이 확인할 수있는 프로그램에서 정적 속성을 쉽게 설정할 수 있습니다. 참조를 저장하십시오 Thread.CurrentThread 스타트 업에서 비교하십시오 Thread.CurrentThread 알아야 할 때 그 참조 :

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;
    }
}

전화로 Program.IsRunningOnStartupThread 당신은 얻을 것입니다 bool 당신이 있든 없다면.

bool ismessageloopthread = system.windows.forms.application.messageloop;

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top