2012-05-17 2 views
1

내 응용 프로그램에서 백그라운드로 수천 개의 파일을 만들지 만이 파일을 실행하면 항상 내 양식이 고정됩니다. 모든 파일을 만든 후에 양식을 다시 사용할 수 있습니다. 교수형없이 제대로 달리는가?배경 작업자가 "내 양식을 동결시킬"원인

private void button5_Click(object sender, EventArgs e) 
    { 
     BackgroundWorker bw = new BackgroundWorker(); 

     bw.WorkerReportsProgress = true; 

     bw.DoWork += new DoWorkEventHandler(
     delegate(object o, DoWorkEventArgs args) 
     { 
      BackgroundWorker b = o as BackgroundWorker; 

      this.Invoke(new MethodInvoker(delegate 
      { 
       getValues();//load some text fields into strings 

       while (counter < counted) 
       { 
        text = richTextBox1.Text; 
        text = text.Replace("number", finalNumber); 

        //create copies 
        if (checkBox1.Checked == true) 
        { 
         while (createdCopies < copies) 
         { 
          createdCopies++; 

          File.WriteAllText(fileName, text); 
          overalCounter++; 
          b.ReportProgress(overalCounter); 
         } 
         counter++; 
         createdCopies = 0; 
        } 
        //dont create copies 
        else 
        { 
         File.WriteAllText(fileName, text); 
         counter++; 
         overalCounter++; 
         b.ReportProgress(overalCounter); 
        } 
        //info about number of files created 
        label6.Text = "created " + overalCounter.ToString() + " files"; 

       } 
       label1.Text = "success"; 
      })); 
    }); 

    if (bw.IsBusy != true) 
    { 
     bw.RunWorkerAsync(); 
    } 

    bw.ProgressChanged += new ProgressChangedEventHandler(
    delegate(object o, ProgressChangedEventArgs args) 
    { 
     this.Text = string.Format("{0}% Completed", args.ProgressPercentage); 
    }); 
    } 

답변

3

this.Invoke은 UI 스레드에서 코드를 실행하여 UI 업데이트를 차단합니다.
Invoke 메서드의 모든 것을 실행하면 모든 것이 UI 스레드에서 실행됩니다.

UI 컨트롤을 수정하고 무거운 작업을 Invoke 외부에 두는 곳마다 별도의 Invoke을 만듭니다.

0

첫 번째 대리인의 실제 작업을 수행하십시오. 두 번째 대리자 this.Invoke(...)은 양식 (= 주 스레드)의 스레드에서 실행되므로 UI를 차단합니다.

관련 문제