2013-10-18 4 views
1

GUI 업데이트 여기에 하나의 네트워크 관련 작업을 수행 할 복수 backgroundworker s 사용하고 있습니다. 기본적으로 해당 사용자를 확인하는 프로세스가 내 페이지에 등록되어 있지 여부. 확인하려면 거의 1000 개의 계정을 가지고 있으므로 사용자를 가져오고 용도를 ​​확인하기 위해 동일한 사용자 이름을 가져 오는 데 datagridview을 사용하고 있습니다. 내 코드가 잘 작동하고 결과를 표시하지만 문제는 datagridview 상태를 업데이트 할 때 그다지 효과적이지 않습니다. 그 긴 프로세스 메서드에서 나는 모든 메서드의 프로세스에 대해 상태 텍스트를 설정하는 데 사용했습니다. login process startedlogged infailed to login입니다. 그러나 Backgroundworker은 상태 열을 업데이트하지 않습니다. 모든 backgroundworker이 완료된 후에 상태를 표시합니다. 누구든지 나에게 각 계정의 상태를 업데이트하는 방법에 대한 아이디어를 줄 수 있습니까 ?? 당신이 DoWorkEvent에 등록 여러 핸들러의 문제를 가지고있는 것처럼 모든여러 Backgroundworker C#

int threadNum; 
    public BackgroundWorker bcheker; 
    private void toolStripButton2_Click(object sender, EventArgs e) 
    { 
     if (wbcheckStatus == WorkerStatus.NotStarted || wblogcheckStatus == WorkerStatus.Completed) 
     { 
      threadNum = -1; 
      SetControlsStatus(ProgramStatus.BChecking); 
      toolStripButton2.Image = aTumblr.Properties.Resources.control_stop; 
      for (int i = 0; i < 4; i++) 
      { 
       bcheker = new BackgroundWorker(); 
       bcheker.DoWork += new DoWorkEventHandler(bcheker_dowork); 
       bcheker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bchecker_completed); 
       bcheker.ProgressChanged +=bcheker_ProgressChanged; 
       bcheker.WorkerReportsProgress = true; 
       bcheker.WorkerSupportsCancellation = true; 
       bcheker.RunWorkerAsync(); 
      } 
     } 
     else 
     { 
      threadNum = 10000; 
      bcheker.CancelAsync(); 
      SetControlsStatus(ProgramStatus.BlogChecking); 
     } 
    }  
    public void bcheker_dowork(object sender, DoWorkEventArgs e) 
    { 
     while (!bcheker.CancellationPending) 
     { 
      int rownum = Interlocked.Increment(ref threadNum); 
      if (rownum >= bchecktableModel.Rows.Count) 
      { 
       break; 
      } 
      Thread.Sleep(1000); 
      BlogChecker bc = new BlogChecker(bchecktableModel[rownum, 1].Text, bchecktableModel[rownum, 2]); 
      bc.check();     
      wblogcheckStatus = WorkerStatus.Running; 

     } 
     if (bcheker.CancellationPending) 
     { 
      wblogcheckStatus = WorkerStatus.Completed; 
      SetControlsStatus(ProgramStatus.BCheckingDone); 

     } 
    } 

    public void bcheker_ProgressChanged(Object sender, ProgressChangedEventArgs e) 
    { 

    } 

    public void bchecker_completed(object sender, EventArgs e) 
    { 
     if (threadNum == bchecktableModel.Rows.Count+1) 
     { 
      SetControlsStatus(ProgramStatus.BCheckingDone); 

      wblogcheckStatus = WorkerStatus.Completed; 
     } 
    } 

답변

0

첫째, 그것은 같습니다

그것은 내 코드 미리

에서 감사합니다.
나는 무슨 일이 일어나고 있는지 잘 모르겠다. 그러나 나는 얼마나 많은 시간이 bcheker_dowork 메쏘드가 호출되는지를 체크 할 것이다.

진행 상황을보고하려면 BackgroundWorker.ReportProgress 방법을 사용하십시오.

public void bcheker_ProgressChanged(Object sender, ProgressChangedEventArgs e) 
{ 
    //Update your progress here 
} 
0

또한, 귀하의 DoWork() 메서드, 당신이로 "bcheker"을 사용하지 않아야 간단하게 만든 마지막 BackgroundWorker에 참조됩니다. 대신, 보낸 사람 매개 변수를 로컬 BackgroundWorker 변수로 캐스팅하고이를 사용하십시오.