2012-01-18 4 views
1

나는 아주 간단한 코드를 가지고 있지만 작동시키지 않습니다. BackgroundWorker를 사용하고 있습니다. 문제는 RunWorkerCompleted가 빨리 실행되는 것입니다. 실행 후 즉시 "작업 완료"메시지가 표시되지만 응용 프로그램은 몇 초 동안 'DataType data = new DataType (path);'으로 고정됩니다. beign 실행됩니다. 그 후 모든 DataGridViews 등이 올바르게 채워집니다. 이 한 줄을 Thread.Sleep으로 바꾸면 모든 것이 잘 작동하는 것 같습니다. 어떤 아이디어?RunWorkerCompleted too faster firing 너무 짧습니다.

public frmWindow(string path) 
    { 
     InitializeComponent(); 
     DataType d; 
     backgroundWorker1.RunWorkerAsync(path); 
    } 

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     string path = e.Argument as string; 
     DataType data = new DataType(path); 
     e.Result = data;    
    } 

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     d = e.Result as DataType; 
     MessageBox.Show("Work completed"); 
    } 
+0

언제 UI를 업데이트하고 있습니까? 코드에서 명확하지 않습니다. 앱이 UI 스레드에있을 가능성이 높습니다 (예 : 그 부분은 백그라운드 작업자 외부에서 실행되는 gridview를 채 웁니다. – RobJohnson

+0

RunWorkerCompleted에 대해 이야기 할 때 DoWork의 행을 언급합니다. – BrokenGlass

+1

'그 후 모든 DataGridViews 등이 올바르게 채워집니다. ' 그리드를 채우는 것은 DoWork() 메소드가 아니라 시간을들이는 것입니다. –

답변

1

MessageBox.Show 대신 Debug.Write를 사용하여 메소드가 입력되고 종료 될 때 표시 할 타이머를 사용하는 것이 좋습니다.

이 백그라운드 스레드가 UI에서 작동 할 수도 있지만 거의 항상 좋은 일은 아닙니다. UI는 스레드 안전하지 않습니다.

BackgroundWorker backGroundWorker1; 
     public frmWindow(string path) 
     { 
      InitializeComponent(); 
      DataType d; 

      backGroundWorker1 = new BackgroundWorker(); 

      backGroundWorker1.DoWork += (s, e) => 
      { 
       System.Diagnostics.Debug.Write("Work started at: " + DateTime.Now + Environment.NewLine); 
       string path = e.Argument as string; 
       DataType data = new DataType(path); 
       e.Result = data; 
      }; 

      backGroundWorker1.RunWorkerCompleted += (s, e) => 
      { 
       d = e.Result as DataType; 
       System.Diagnostics.Debug.Write("Work completed at: " + DateTime.Now + Environment.NewLine); 
      }; 

      backGroundWorker1.RunWorkerAsync(); 

     }