2012-11-06 3 views
0

메인 폼과 진행 상태가 표시된 다른 양식의 멀티 스레딩 응용 프로그램을 개발했습니다. 처음에는 : 나는 MainForm다른 스레드의 주 스레드에서 양식 표시

Progress p=new Progress(); 

두 번째에 ProgressForm를 만들 : 나는 (내 응용 프로그램의 모든 데이터 아 파크) 클래스 모델의 새로운 인스턴스를 생성합니다.

Model m = new Model(); 

및 이벤트에 대한 가입 :

m.OperationStarted += new EventHandler(OnCopyStarted); 

private void OnCopyStarted(object sender, EventArgs e) 
{ 
    p.Show(); 
} 

셋째, 내가 다른 모델

private bool isStarted; 
      public bool IsStarted 
      { 
       get{return isStarted;} 
       set 
       { 
        isStarted = value; 
        if (isStarted && OperationStarted != null) 
        { 
         OperationStarted(this, EventArgs.Empty); 
        } 
       } 
      } 

내보고자하는의 속성을 변경 다른 스레드에서 일부 작업을 실행은 왜 진행 형태는 주 스레드에 표시되지 않습니까? 잠김없이 실행할 수있는 방법은 무엇입니까?

+0

이러한 스 니펫은 문제와 관련이없는 것 같습니다. 가능한 실패 모드는 주 스레드가 이벤트를 구독하기 전에 스레드를 너무 빨리 시작하는 것입니다. 디버거를 사용하십시오. –

+0

메인 스레드에서 UI 요소 만 만들고 액세스해야한다고 생각했습니다. –

답변

2

모든 UI 작업은 메인 UI 스레드에서 실행해야합니다.

OnCopyStarted 메서드가 다른 스레드에서 호출되기 때문에 대화 상자를 표시하기 전에 UI 스레드로 전환해야합니다.

양식의 BeginInvoke를 사용하여 UI 스레드로 전환 할 수 있습니다. 예 :

void OnCopyStarted(object sender, EventArgs e) 
{ 
    p.BeginInvoke((Action) (() => p.Show())); 
} 
2

하면보십시오 :

var t = new Thread(() => { 
      Application.Run(new Progress()); 
     }); 
t.Start(); 
관련 문제