2017-09-25 17 views
0

実行中のタスクがあり、いつでも実行中のタスクを停止できる機能を作成する必要があります。私はtoken.Cancel()にしようとしました。それでも動作しませんでした。ここCで実行中のタスクを停止する方法

が私のコードです:

var task = new Task(new Action(Method), tokenSource2.Token); 
var cToken = tokenSource2.Token; 
cToken.Register(() => cancelNotification()); 

// code to stop the running task .. button click event 

if (tokenSource2 != null) 
      { 

       tokenSource2.Cancel(); 


      } 
+3

キャンセルトークンは作業の本体として呼び出され、取り消しトークンを受け入れ、ロジックの各ステップ間でキャンセルされているかどうかを常に確認する必要があります。 –

+2

タスクのキャンセルは相互に関係しています。トークンをキャンセルしても魔法のようにタスクが中断されるわけではなく、トークンがキャンセルされて正常に終了するかどうかをチェックする必要があります。 – Equalsk

答えて

2

キャンセルトークンが機能するために、私は信じて、この方法は、タスクの本体はキャンセルトークンを受け入れ、常にそれがそれぞれの間にキャンセルされたかどうかを確認する必要があると呼ばれていますロジックのステップ。 See here for more details

この例は、このドキュメントの抜粋であり、取り消しトークンの状態を確認する方法の概要を示しています。

using System; 
using System.Threading; 

public class Example 
{ 
    public static void Main() 
    { 
     // Create the token source. 
     CancellationTokenSource cts = new CancellationTokenSource(); 

     // Pass the token to the cancelable operation. 
     ThreadPool.QueueUserWorkItem(new WaitCallback(DoSomeWork), cts.Token); 
     Thread.Sleep(2500); 

     // Request cancellation. 
     cts.Cancel(); 
     Console.WriteLine("Cancellation set in token source..."); 
     Thread.Sleep(2500); 
     // Cancellation should have happened, so call Dispose. 
     cts.Dispose(); 
    } 

    // Thread 2: The listener 
    static void DoSomeWork(object obj) 
    { 
     CancellationToken token = (CancellationToken)obj; 

     for (int i = 0; i < 100000; i++) { 
     if (token.IsCancellationRequested) 
     { 
      Console.WriteLine("In iteration {0}, cancellation has been requested...", 
           i + 1); 
      // Perform cleanup if necessary. 
      //... 
      // Terminate the operation. 
      break; 
     } 
     // Simulate some work. 
     Thread.SpinWait(500000); 
     } 
    } 
} 
// The example displays output like the following: 
//  Cancellation set in token source... 
//  In iteration 1430, cancellation has been requested... 
関連する問題