2013-10-22 2 views
0

나는 스폰Form으로 평소와 같이 사용할 수 있지만 메인 스레드는 이후에 무엇을 하든지 계속해야합니다. 내가 양식을 사용할 수 없습니다 이하 나는이 개 기술을 시도 할 때 : 양식을 생성하고 주 스레드를 차단하지 않는 방법은 무엇입니까?

static class Program 
{ 
    private static void spawnForm1() 
    { 
     new Form1().Show(); 
    } 

    private static void spawnForm2() 
    { 
     // solved: use ShowDialog() instead of Show() here 
     ThreadPool.QueueUserWorkItem(o => { new Form1().Show(); }); 
    } 

    [STAThread] 
    static void Main() 
    { 
     spawnForm1(); 
     MessageBox.Show("main thread continues"); 
     // now anything can happen: background processing or start of main form 
     // sleeping is just an example for how the form is unresponsive 
     Thread.Sleep(30 * 1000); 
    } 
} 

그래서 어떻게 간단한 형태를 생성하고 메인 쓰레드를 계속 할 수 있습니까? 메시지 상자와 마찬가지로 응답해야합니다.

(또한, 나는 Application.Run(...);를 사용할 수 있으며 메인 스레드를 차단한다면 나는 ShowDialog()을 사용할 수 없습니다 : 나는별로 명성을 가지고 미안하지만, 내가 정말 필요 멍청한 놈 질문하지 않습니다 설명하려고했던 것처럼 스폰 됨)

+0

이것은 심각한 디자인 문제처럼 들립니다. * my * WinForm 앱의 주 스레드는 항상 UI를 담당하고 다른 스레드 (스레드 풀 및/또는 백그라운드 작업자)는 다른 비 시각적 작업을 담당합니다. 귀하의 질문은 내게 당신이 그것을 다른 방향으로하고 싶다고 생각합니다. –

+0

@UweKeim 주 창은 항상 같은 응용 프로그램에 의해 실행됩니다. 그러나 기존의 메인 윈도우와 그렇지 않은 윈도우 모두에서 설명하는 것처럼 윈도우를 생성해야합니다. – Bitterblue

+1

주 스레드에서 창을 시작하고 대신 해당 창에서 백그라운드 처리를 수행하십시오. –

답변

1

메시지 루프가 없기 때문에 코드가 작동하지 않습니다. UI 요소가 제대로 작동하려면 메시지 루프를 시작하기 만하면됩니다. 즉, 어떤 시점에서는 Application.Run 또는 Form.ShowDialog으로 전화해야합니다.

UI 용 엔트리 포인트 스레드를 사용하고 UI 실행 중에 다른 작업을 수행 할 수있는 작업자 스레드를 만들 수없는 이유는 없습니다.

[STAThread] 
public static void Main() 
{ 
    Task.Run(() => DoOtherStuff()); 
    Application.Run(new YourForm()); 
} 

코멘트에 썼다 :

메인 윈도우는 항상 같은 응용 프로그램에 의해 실행된다. 그러나 나는 상황이 기존 메인 윈도우 과 그것도없이 모두에서 설명한 것처럼 창 을 산란해야합니다.

진입 점 스레드와 별도 스레드 모두에서 Form 인스턴스를 실행한다고 가정합니다. 내 충고는이 일을 피하는 것입니다. 그것은 잘 작동하지 않습니다. 일어날 수있는 이상한 일들이 많이 있습니다. 단 하나의 UI 스레드가 있도록 디자인을 다시 생각해보십시오. 시간이 많이 걸리는 작업을 작업 스레드로 이동하십시오.

+0

첫 번째 단락에만 답을 수락합니다. 그것은 실수를 찾는데 도움이되었습니다. 모든 창문에 메시지 루프가 필요하다는 사실을 잊어 버렸습니다. – Bitterblue

3

UI를 표시하기 위해 새 스레드를 만들지 마십시오. 당신은 UI 스레드에 있으며 양식을 보여주는 스레드 여야합니다. 대신 수행하려는 비 UI 작업을 수행 할 새 스레드를 생성하십시오.

[STAThread] 
static void Main() 
{ 
    Task.Run(()=> 
     { 
      //do non-UI work here 
      Thread.Sleep(30 * 1000); 
     }); 
    Application.Run(new Form1()); 
} 
관련 문제