2009-08-27 13 views

答えて

3

このチュートリアルチェックアウト:キャンセルをサポートするSystem.ComponentModel.BackgroundWorkerスレッドのためにhttp://www.albahari.com/threading/part3.aspx

を、あなたがスレッドを起動する前にTrueにWorkerSupportsCancellationプロパティを設定する必要があります。

その後、BackgroundWorkerの.CancelAsyncメソッドを呼び出してスレッドをキャンセルすることができます。

+0

私は上記の記事を読みましたが、私はどのようなあなたの呼び出し元のスレッドでSystem.Threading.Timerオブジェクトを作成し、約1分後に –

+2

私のバックグラウンドワーカーを終了し、1分間に設定する必要があります。タイマーイベントが発生すると、BackgroundWorkerスレッドの.CancelAsyncメソッドを呼び出します。 – TLiebe

0

BackgroundWorkerにはどちらのケースもサポートされていません。 これらのケースをサポートするためのコードの一部がここにあります。

class MyBackgroundWorker :BackgroundWorker { 
    public MyBackgroundWorker() { 
     WorkerReportsProgress = true; 
     WorkerSupportsCancellation = true; 
    } 

    protected override void OnDoWork(DoWorkEventArgs e) { 
     var thread = Thread.CurrentThread; 
     using(var cancelTimeout = new System.Threading.Timer(o => CancelAsync(), null, TimeSpan.FromMinutes(1), TimeSpan.Zero)) 
     using(var abortTimeout = new System.Threading.Timer(o => thread.Abort(), null, TimeSpan.FromMinutes(2), TimeSpan.Zero)) { 
      for(int i = 0; i <= 100; i += 20) { 
       ReportProgress(i); 

       if(CancellationPending) { 
        e.Cancel = true; 
        return; 
       } 

       Thread.Sleep(1000); //do work 
      } 
      e.Result = "My Result"; //report result 

      base.OnDoWork(e); 
     } 
    } 
} 
+0

'Task.Delay'はThread.Sleep''の2017年版です。 – mayu

関連する問題