2012-04-08 2 views
2

백그라운드 작업자를 취소하고 처리 할 때 VS 스레드 목록에서 사라지더라도 작업이 닫힐 때까지 기다리는 내 응용 프로그램을 계속보고합니다. 또한 내 RunWorkerCompleted 이벤트는 발생하지 않습니다.배경 작업자가 취소되었지만 더 이상 존재하지 않는 것으로보고합니다.

디버깅을하면 코드가 더 이상 실행되지 않고 종료되었음을 알 수 있습니다. 나는 .IsBusy 체크를 제거하면

은 VS 더 이상 VS에 나와있는 스레드가 폐쇄 후 계속 작동 이유를 이해할 수없는

"이 BackgroundWorker에 현재 사용량이 동시에 여러 작업을 실행할 수 없습니다"보고 .

 private void UpdateTimeLine() 
     { 

     txtb_timeline.Text = "Updating..."; 


     startTimelineUpdater.DoWork += new DoWorkEventHandler(startTimelineUpdater_DoWork); 
     startTimelineUpdater.RunWorkerAsync("hometimeline"); 

     startTimelineUpdater.WorkerReportsProgress = true; 
     startTimelineUpdater.ProgressChanged += new ProgressChangedEventHandler 
              (startTimelineUpdater_ProgressChanged); 
     startTimelineUpdater.WorkerSupportsCancellation = true; 

    } 


    void startTimelineUpdater_DoWork(object sender, DoWorkEventArgs e) 
    { 
     //begin the thread to maintain updates of SQL   
     beginRegUpdateTimeline.DoWork += new DoWorkEventHandler(beginRegUpdateTimeline_DoWork); 
     beginRegUpdateTimeline.RunWorkerAsync(); 
     beginRegUpdateTimeline.WorkerSupportsCancellation = true; 

     while (true) 
     { 
      List<string[]> sqlset; 

      Xtweet getSQL = new Xtweet(); 

      if(e.Argument.ToString() == "hometimeline") 
      { 
       sqlset = getSQL.CollectLocalTimelineSql(); 
      } 
      else 
      { 
       sqlset = getSQL.CollectLocalTimelineSql(Int64.Parse(e.Argument.ToString())); 
      } 

      int i = 0; 
      while (i < 10) 
      { 
       foreach (var stringse in sqlset) 
       { 
        StringBuilder sb = new StringBuilder(); 

        sb.Append(stringse[0]); 
        sb.Append(": "); 
        sb.Append(stringse[1]); 
        sb.Append(" @ "); 
        sb.Append(stringse[2]); 

        sb.Append("\n"); 

        BackgroundWorker bkgwk = sender as BackgroundWorker; 
        bkgwk.ReportProgress(0, sb.ToString()); 

        Thread.Sleep(1000); 

        i++; 

        if(startTimelineUpdater.CancellationPending) 
        { 
         e.Cancel = true; 
         startTimelineUpdater.Dispose(); 
         break; 
        } 

       } 
       if (e.Cancel == true) 
       { 
        break; 
       } 

      } 

      if (e.Cancel == true) 
      { 
       break; 

      } 

     } 


    } 

    /// <summary> 
    /// Handles the DoWork event of the beginRegUpdateTimeline control. 
    /// Updates the timeline sql on a regular basis 
    /// </summary> 
    /// <param name="sender">The source of the event.</param> 
    /// <param name="e">The <see cref="System.ComponentModel.DoWorkEventArgs"/> instance containing the event data.</param> 
    void beginRegUpdateTimeline_DoWork(object sender, DoWorkEventArgs e) 
    { 

     while (true) 
     { 
      //update time in seconds 
      int secs = 10; 

      Xtweet.PreSqlDataCollection(null,null); 
      Thread.Sleep(secs*1000); 

      if(beginRegUpdateTimeline.CancellationPending) 
      { 
       e.Cancel = true; 
       beginRegUpdateTimeline.Dispose(); 
       break; 
      } 


     } 


    } 

    private void startTimelineUpdater_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     txtb_timeline.Text = e.UserState.ToString(); 

    } 

답변

2

스레드 수면 후 Application.DoEvents으로 전화하십시오.

으로는 here을 언급 한 다음 UI 스레드 제어를 얻을 때까지

는 BackgroundWorker에 단순히 완료보고하지 않습니다.

업데이트 :이 이후

당신이 내가 언급해야 Dispatcher

+0

를 사용한다, WPF이며,이 WPF이다. 나는 DoEvents가 있다고 생각하지 않습니까? – Damo

+0

Windows.Forms에 대한 참조를 추가했는데 잘 작동했습니다. – Damo

+1

@Damo 대신 [Dispatcher] (http://stackoverflow.com/a/4502200/884410)를 사용해야합니다. –

관련 문제