CancellationTokenSource.Cancel メソッド

定義

取り消しの要求を伝えます。

オーバーロード

名前 説明
Cancel()

取り消しの要求を伝えます。

Cancel(Boolean)

取り消し要求を通知し、例外が発生した場合に残りのコールバックと取り消し可能な操作を処理するかどうかを指定します。

Cancel()

ソース:
CancellationTokenSource.cs
ソース:
CancellationTokenSource.cs
ソース:
CancellationTokenSource.cs
ソース:
CancellationTokenSource.cs
ソース:
CancellationTokenSource.cs

取り消しの要求を伝えます。

public:
 void Cancel();
public void Cancel();
member this.Cancel : unit -> unit
Public Sub Cancel ()

例外

この CancellationTokenSource は破棄されています。

関連付けられた CancellationTokenで登録されたコールバックによってスローされたすべての例外を含む集計例外。

次の例では、乱数ジェネレーターを使用して、11 個の異なるインストルメントから 10 個の整数値を読み取るデータ収集アプリケーションをエミュレートします。 値が 0 の場合は、1 つの装置で測定が失敗したことを示します。この場合、操作を取り消して、全体の平均を計算する必要はありません。

この例では、操作のキャンセルの可能性を処理するために、CancellationTokenSource オブジェクトに渡されるキャンセル トークンを生成するTaskFactory オブジェクトをインスタンス化します。 TaskFactory オブジェクトは、特定のインストルメントの読み取り値の収集を担当する各タスクにキャンセル トークンを渡します。 すべての読み取り値が正常に収集された後にのみ平均が計算されるように、 TaskFactory.ContinueWhenAll<TAntecedentResult,TResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>[],TResult>, CancellationToken) メソッドが呼び出されます。 タスクが取り消されたために実行されていない場合は、 TaskFactory.ContinueWhenAll メソッドの呼び出しによって例外がスローされます。

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      // Define the cancellation token.
      CancellationTokenSource source = new CancellationTokenSource();
      CancellationToken token = source.Token;

      Random rnd = new Random();
      Object lockObj = new Object();
      
      List<Task<int[]>> tasks = new List<Task<int[]>>();
      TaskFactory factory = new TaskFactory(token);
      for (int taskCtr = 0; taskCtr <= 10; taskCtr++) {
         int iteration = taskCtr + 1;
         tasks.Add(factory.StartNew( () => {
           int value;
           int[] values = new int[10];
           for (int ctr = 1; ctr <= 10; ctr++) {
              lock (lockObj) {
                 value = rnd.Next(0,101);
              }
              if (value == 0) { 
                 source.Cancel();
                 Console.WriteLine("Cancelling at task {0}", iteration);
                 break;
              }   
              values[ctr-1] = value; 
           }
           return values;
        }, token));   
      }
      try {
         Task<double> fTask = factory.ContinueWhenAll(tasks.ToArray(), 
         (results) => {
            Console.WriteLine("Calculating overall mean...");
            long sum = 0;
            int n = 0; 
            foreach (var t in results) {
               foreach (var r in t.Result) {
                  sum += r;
                  n++;
               }
            }
            return sum/(double) n;
         } , token);
         Console.WriteLine("The mean is {0}.", fTask.Result);
      }   
      catch (AggregateException ae) {
         foreach (Exception e in ae.InnerExceptions) {
            if (e is TaskCanceledException)
               Console.WriteLine("Unable to compute mean: {0}", 
                  ((TaskCanceledException) e).Message);
            else
               Console.WriteLine("Exception: " + e.GetType().Name);
         }
      }
      finally {
         source.Dispose();
      }
   }
}
// Repeated execution of the example produces output like the following:
//       Cancelling at task 5
//       Unable to compute mean: A task was canceled.
//       
//       Cancelling at task 10
//       Unable to compute mean: A task was canceled.
//       
//       Calculating overall mean...
//       The mean is 5.29545454545455.
//       
//       Cancelling at task 4
//       Unable to compute mean: A task was canceled.
//       
//       Cancelling at task 5
//       Unable to compute mean: A task was canceled.
//       
//       Cancelling at task 6
//       Unable to compute mean: A task was canceled.
//       
//       Calculating overall mean...
//       The mean is 4.97363636363636.
//       
//       Cancelling at task 4
//       Unable to compute mean: A task was canceled.
//       
//       Cancelling at task 5
//       Unable to compute mean: A task was canceled.
//       
//       Cancelling at task 4
//       Unable to compute mean: A task was canceled.
//       
//       Calculating overall mean...
//       The mean is 4.86545454545455.
Imports System.Collections.Generic
Imports System.Threading
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      ' Define the cancellation token.
      Dim source As New CancellationTokenSource()
      Dim token As CancellationToken = source.Token

      Dim lockObj As New Object()
      Dim rnd As New Random

      Dim tasks As New List(Of Task(Of Integer()))
      Dim factory As New TaskFactory(token)
      For taskCtr As Integer = 0 To 10
         Dim iteration As Integer = taskCtr + 1
         tasks.Add(factory.StartNew(Function()
                                       Dim value, values(9) As Integer
                                       For ctr As Integer = 1 To 10
                                          SyncLock lockObj
                                             value = rnd.Next(0,101)
                                          End SyncLock
                                          If value = 0 Then 
                                             source.Cancel
                                             Console.WriteLine("Cancelling at task {0}", iteration)
                                             Exit For
                                          End If   
                                          values(ctr-1) = value 
                                       Next
                                       Return values
                                    End Function, token))   
         
      Next
      Try
         Dim fTask As Task(Of Double) = factory.ContinueWhenAll(tasks.ToArray(), 
                                                         Function(results)
                                                            Console.WriteLine("Calculating overall mean...")
                                                            Dim sum As Long
                                                            Dim n As Integer 
                                                            For Each t In results
                                                               For Each r In t.Result
                                                                  sum += r
                                                                  n+= 1
                                                               Next
                                                            Next
                                                            Return sum/n
                                                         End Function, token)
         Console.WriteLine("The mean is {0}.", fTask.Result)
      Catch ae As AggregateException
         For Each e In ae.InnerExceptions
            If TypeOf e Is TaskCanceledException
               Console.WriteLine("Unable to compute mean: {0}", 
                                 CType(e, TaskCanceledException).Message)
            Else
               Console.WriteLine("Exception: " + e.GetType().Name)
            End If   
         Next
      Finally
         source.Dispose()
      End Try                                                          
   End Sub
End Module
' Repeated execution of the example produces output like the following:
'       Cancelling at task 5
'       Unable to compute mean: A task was canceled.
'       
'       Cancelling at task 10
'       Unable to compute mean: A task was canceled.
'       
'       Calculating overall mean...
'       The mean is 5.29545454545455.
'       
'       Cancelling at task 4
'       Unable to compute mean: A task was canceled.
'       
'       Cancelling at task 5
'       Unable to compute mean: A task was canceled.
'       
'       Cancelling at task 6
'       Unable to compute mean: A task was canceled.
'       
'       Calculating overall mean...
'       The mean is 4.97363636363636.
'       
'       Cancelling at task 4
'       Unable to compute mean: A task was canceled.
'       
'       Cancelling at task 5
'       Unable to compute mean: A task was canceled.
'       
'       Cancelling at task 4
'       Unable to compute mean: A task was canceled.
'       
'       Calculating overall mean...
'       The mean is 4.86545454545455.

注釈

関連付けられている CancellationToken はキャンセルの通知を受け取り、 IsCancellationRequested が true を返す状態に遷移します。

CancellationTokenに登録されているコールバックまたはキャンセル可能な操作は、Cancel()への以前の呼び出しによってまだ実行されていない場合に実行されます。 Cancel()への後続の呼び出しでは、再登録されない限り、同じコールバックが再度実行されません。 (このようなコードの意図が明確でないため、 Cancel()を複数回呼び出さないようにします)。

コールバックは LIFO 順序で同期的に実行されます。

CancellationTokenに登録されているキャンセル可能な操作とコールバックは例外をスローしないことをお勧めします。

Cancel のこのオーバーロードは、例外をスローする 1 つのコールバックが他の登録済みコールバックの実行を妨げないように、 AggregateExceptionにスローされたすべての例外を集計します。

このメソッドの呼び出しは、 Cancel(false)の呼び出しと同じ効果があります。

こちらもご覧ください

適用対象

Cancel(Boolean)

ソース:
CancellationTokenSource.cs
ソース:
CancellationTokenSource.cs
ソース:
CancellationTokenSource.cs
ソース:
CancellationTokenSource.cs
ソース:
CancellationTokenSource.cs

取り消し要求を通知し、例外が発生した場合に残りのコールバックと取り消し可能な操作を処理するかどうかを指定します。

public:
 void Cancel(bool throwOnFirstException);
public void Cancel(bool throwOnFirstException);
member this.Cancel : bool -> unit
Public Sub Cancel (throwOnFirstException As Boolean)

パラメーター

throwOnFirstException
Boolean

true 例外が直ちに伝達される場合。それ以外の場合は false

例外

この CancellationTokenSource は破棄されています。

関連付けられた CancellationTokenで登録されたコールバックによってスローされたすべての例外を含む集計例外。

注釈

関連付けられている CancellationToken はキャンセルの通知を受け取り、 IsCancellationRequestedtrueを返す状態に遷移します。

CancellationTokenに登録されているコールバックまたはキャンセル可能な操作は、Cancel()への以前の呼び出しによってまだ実行されていない場合に実行されます。 Cancel()への後続の呼び出しでは、再登録されない限り、同じコールバックが再度実行されません。 (このようなコードの意図が明確でないため、 Cancel()を複数回呼び出さないようにします)。

コールバックは LIFO 順序で同期的に実行されます。

CancellationTokenに登録されているキャンセル可能な操作とコールバックは例外をスローしないことをお勧めします。

throwOnFirstExceptiontrueされている場合、例外はすぐにCancelの呼び出しから伝達され、残りのコールバックと取り消し可能な操作が処理されなくなります。

throwOnFirstExceptionfalse場合、このオーバーロードは、例外をスローする 1 つのコールバックが他の登録済みコールバックの実行を妨げないように、AggregateExceptionにスローされたすべての例外を集計します。

こちらもご覧ください

適用対象