2012-03-21 29 views
1

バックグラウンドワーカーのほとんどの例はforループで構成されています。しかし、私の必要条件はループを必要としません。私はbackgroundworkerを実行している次のコードを持っています。 forループを使用せずにワーカープロセスをキャンセルするにはどうすればいいですか?バックグラウンドワーカーを停止する方法

void form_DoWork(LoadingProgress sender, DoWorkEventArgs e) 
    { 

      //for (int i = 0; i < 100; i++) 
     //{ 


     // System.Threading.Thread.Sleep(50); 
     // sender.SetProgress(i, "Step " + i.ToString() + "/100..."); 
     // if (sender.CancellationPending) 
     // { 
     //  e.Cancel = true; 
     //  return; 
     // } 
     //} 
       // heavy database process  
      SomeClass.BulkInsert(ExportLine); 
     } 


    private void ButtonCancelClick(object sender, EventArgs e) 
    { 
     //notify the background worker we want to cancel 
     worker.CancelAsync(); 
     //disable the cancel button and change the status text 
     buttonCancel.Enabled = false; 
     labelStatus.Text = CancellingText; 
    } 
+4

あなたは少なくともノー簡単に、することはできません。 BulkInsertは操作をキャンセルする方法を提供しないので、スレッドを中止するのに手間がかかりません。それはちょっと面倒です。 –

+0

時間のかかる処理の進捗状況を表示するための代替手段 – arjun

+0

何か助けてください – arjun

答えて

2

これは、必要な場合には私は使用しません。あなたのクラスは進行状況の更新を提供する方法を提供していないので、あなたに与える唯一のことはRunWorkerCompletedメソッドを整列することです。

は、Threadクラスを作成し、それへの参照を保持し、あなたがする必要がある場合は中止します。あなたのバックグラウンド作業が終了したときに、コントロールで結果を更新する場合はInvokeを呼び出してください。

編集:

これはどのように機能するかの原始的な例です。 (注:これはコンパイルできないかもしれませんが、私はIDEに書きませんでした)。

Thread _dbThread; 

void DoLongRunningQueryAsync() 
    { 
     bool dbWorkFinished = false; 
     _dbThread = new Thread(() => 
     { 
      // heavy database process  
      SomeClass.BulkInsert(ExportLine); 
      dbWorkFinished = true; 
     }); 
     Thread monitorThread = new Thread(() => 
     { 
      Thread.Sleep(5000); 
      if (!dbWorkFinished) 
      { 
       //Db work took too long. Abort 
       _dbThread.Abort(); 
       this.Invoke(() => MessageBox.Show("Db work took too long. Query aborted");); 
      } 
     }); 
     _dbThread.Start(); 
     monitorThread.Start(); 
    } 


    private void ButtonCancelClick(object sender, EventArgs e) 
    { 
     _dbThread.Abort() 
    } 
+0

上記のコードを参考にする方法を教えてください。キャンセルボタンも必要です。キャンセルするには、プロセスを中止してください。 – arjun

関連する問題