2017-09-08 4 views
-1

아래 코드에서 무엇이 잘못되었는지 알 수 없습니다. Parallel.For가 양식을 고정시키고 있기 때문에 배경 작업자를 사용했습니다. 그러나 문자열은 의도 한대로 을 반환하지 않습니다. 또한 backgroundworker에서 progressbar에 대한 보고서를 사용하는 방법에 대해 잘 모르겠습니다. 변수 int i가 필요 없다고 생각합니다. 그러나 그것 없이는, 나는 진전을보고 할 수 없다.배경 작업자가 값을 반환하지 않습니다.

bw.RunWorkerAsync(); 
alltrdoc = string.Join(Environment.NewLine, alltrdoc1); 
saveposcdic(); 
return alltrdoc; 

bw.RunWorkerAsync가 즉시 반환, 그래서 alltrdoc은 빈 문자열입니다 : 문제가 현재의 구현입니다

private string trdoc(string str) 
     { 
      string alltrdoc; 
      var alldoc = str.Split('\n'); 
      string[] alltrdoc1 = new string[alldoc.Length]; 
      pb1.Maximum = alldoc.Length;//progressbar 
      pb1.Value = 0; 

      int i = 0; 

      BackgroundWorker bw = new BackgroundWorker(); 

      // this allows our worker to report progress during work 
      bw.WorkerReportsProgress = true; 

      // what to do in the background thread 
      bw.DoWork += new DoWorkEventHandler(
      delegate (object o, DoWorkEventArgs e) 
      { 

       Parallel.For(0, alldoc.Length, new ParallelOptions { MaxDegreeOfParallelism = 4 }, 
       index => 
       { 
        alltrdoc1[index] = translate(alldoc[index]); 

      bw.ReportProgress(i++); 
       }); 

       e.Result = alltrdoc1; 

      }); 

      bw.ProgressChanged += new ProgressChangedEventHandler(
     delegate (object o, ProgressChangedEventArgs e) 
     { 

      if (pb1.Value <= pb1.Maximum) 
      { 
       pb1.Value++; 
      } 
     }); 

      // what to do when worker completes its task (notify the user) 
      bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
      delegate (object o, RunWorkerCompletedEventArgs e) 
      { 
       alltrdoc1 = e.Result as string[]; 
      }); 

      bw.RunWorkerAsync(); 
      alltrdoc = string.Join(Environment.NewLine, alltrdoc1); 
      saveposcdic(); 
      return alltrdoc; 

     } 
+1

parallel.for는 이미 다중 밟기를하고 있습니다. 당신은 배경 작업자가 필요 없습니다. –

+0

Parallel.for가 양식 GUI를 고정시킵니다. 아마도 번역 방법 때문에. – user1785594

+0

디버거를 사용하여 코드의 어느 부분이 고정되는지 확인하십시오. –

답변

0

당신의 trdoc의 끝은() 메소드이다. alltrdoc1 배열은 RunWorkerCompleted가 실행 된 후에 만 ​​채워집니다. 그것은 당신이 alltrdoc을 창조하고 계속할 수있는 곳입니다.

+0

alltrdoc = string.Join을 추가하면 (Environment.NewLine, alltrdoc1); bw.completed에 반환 alltrdoc에 오류가 있습니다. 할당되지 않은 지역 변수를 사용한다고 말했습니다. 어떻게 해결할 수 있습니까? 나는 프로그래밍에 능숙하지 않다 ... – user1785594

+0

예, 클래스 레벨에 alltrdoc을 추가했는데 솔루션이 거의 작동했습니다. 문제는 alltrdoc를 반환하는 것입니다. bw가 완료되면 alltrdoc를 반환하지 않습니다. 그래서 trtoc(); 메소드를 두 번 실행하여 richtextbox 컨트롤에 번역 된 값을 표시해야합니다. 나는 반환 alltrdoc를 둘 수 없다; 오류가 발생하기 때문에 bw.completed에 입력하십시오. – user1785594