CancellationTokenSource CancellationTokenSource CancellationTokenSource CancellationTokenSource Class

定義

CancellationToken を取り消すことをそれに通知します。

public ref class CancellationTokenSource : IDisposable
[System.Runtime.InteropServices.ComVisible(false)]
public class CancellationTokenSource : IDisposable
type CancellationTokenSource = class
    interface IDisposable
Public Class CancellationTokenSource
Implements IDisposable
継承
CancellationTokenSourceCancellationTokenSourceCancellationTokenSourceCancellationTokenSource
属性
実装

次の例では、乱数ジェネレーターを使用して、エミュレートを 11 個の異なる instruments から 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.

注釈

以降では、 .NET Framework 4、.NET Framework では、2 つのオブジェクトを含む非同期または長時間同期操作の連携によるキャンセルの統一されたモデルを使用します。

  • ACancellationTokenSourceを通じてキャンセル トークンを提供するオブジェクトは、そのTokenプロパティおよび取り消しを呼び出すことによってメッセージ送信のCancelまたはCancelAfterメソッド。

  • ACancellationTokenオブジェクトで、キャンセルが要求されたかどうかを示します。

連携によるキャンセル処理モデルを実装するための一般的なパターンは次のとおりです。

  • CancellationTokenSource オブジェクトのインスタンスを作成します。このオブジェクトでは、個々のキャンセル トークンへのキャンセル通知を管理し、送信します。

  • CancellationTokenSource.Token プロパティによって返されるトークンを、キャンセルをリッスンしているそれぞれのタスクまたはスレッドに渡します。

  • 呼び出す、CancellationToken.IsCancellationRequestedキャンセル トークンを受信する操作からのメソッド。 各タスクまたはスレッドのキャンセル要求に応答するためのメカニズムを提供します。 キャンセル操作、および正確にその方法を選択するかどうかは、アプリケーション ロジックに依存します。

  • キャンセルの通知を提供する CancellationTokenSource.Cancel メソッドを呼び出します。 これにより設定、CancellationToken.IsCancellationRequestedプロパティにキャンセル トークンのすべてのコピーをtrueします。

  • 呼び出す、Disposeメソッドが完了したら、CancellationTokenSourceオブジェクト。

詳細については、「マネージド スレッドのキャンセル」を参照してください。

重要

この型は、IDisposableインターフェイス。 型のインスタンスを使用してが完了したら、直接的または間接的にそれを破棄する必要があります。 型の直接 dispose を呼び出してそのDisposeメソッド、 try / catchブロックします。 直接ことのない破棄する場合など、言語コンストラクトを使用してusing(で C# の場合) またはUsing(Visual Basic) でします。 詳細については、"を使用して、オブジェクトを実装する IDisposable"のセクションを参照してください、IDisposableインターフェイスに関するトピック。

コンストラクター

CancellationTokenSource() CancellationTokenSource() CancellationTokenSource() CancellationTokenSource()

CancellationTokenSource クラスの新しいインスタンスを初期化します。

CancellationTokenSource(Int32) CancellationTokenSource(Int32) CancellationTokenSource(Int32) CancellationTokenSource(Int32)

指定した遅延 (ミリ秒単位) が経過した後にキャンセルされる CancellationTokenSource クラスの新しいインスタンスを初期化します。

CancellationTokenSource(TimeSpan) CancellationTokenSource(TimeSpan) CancellationTokenSource(TimeSpan) CancellationTokenSource(TimeSpan)

指定した時間間隔の後にキャンセルされる CancellationTokenSource クラスの新しいインスタンスを初期化します。

プロパティ

IsCancellationRequested IsCancellationRequested IsCancellationRequested IsCancellationRequested

この CancellationTokenSource に対して取り消しが要求されているかどうかを取得します。

Token Token Token Token

この CancellationToken に関連付けられている CancellationTokenSource を取得します。

メソッド

Cancel() Cancel() Cancel() Cancel()

キャンセル要求を伝えます。

Cancel(Boolean) Cancel(Boolean) Cancel(Boolean) Cancel(Boolean)

キャンセル要求を伝え、例外が発生した場合に残りのコールバックとキャンセル可能な操作を続けるかどうかを指定します。

CancelAfter(Int32) CancelAfter(Int32) CancelAfter(Int32) CancelAfter(Int32)

指定したミリ秒数の経過後に、この CancellationTokenSource のキャンセル操作を設定します。

CancelAfter(TimeSpan) CancelAfter(TimeSpan) CancelAfter(TimeSpan) CancelAfter(TimeSpan)

指定した時間間隔の経過後に、この CancellationTokenSource のキャンセル操作を設定します。

CreateLinkedTokenSource(CancellationToken, CancellationToken) CreateLinkedTokenSource(CancellationToken, CancellationToken) CreateLinkedTokenSource(CancellationToken, CancellationToken) CreateLinkedTokenSource(CancellationToken, CancellationToken)

いずれかのソース トークンが取り消された状態であるときに、取り消された状態になる CancellationTokenSource を作成します。

CreateLinkedTokenSource(CancellationToken[]) CreateLinkedTokenSource(CancellationToken[]) CreateLinkedTokenSource(CancellationToken[]) CreateLinkedTokenSource(CancellationToken[])

指定された配列のいずれかのソース トークンが取り消された状態であるときに、取り消された状態になる CancellationTokenSource を作成します。

Dispose() Dispose() Dispose() Dispose()

CancellationTokenSource クラスの現在のインスタンスによって使用されているすべてのリソースを解放します。

Dispose(Boolean) Dispose(Boolean) Dispose(Boolean) Dispose(Boolean)

CancellationTokenSource クラスが使用しているアンマネージド リソースを解放し、オプションでマネージド リソースも解放します。

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。

(Inherited from Object)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

既定のハッシュ関数として機能します。

(Inherited from Object)
GetType() GetType() GetType() GetType()

現在のインスタンスの Type を取得します。

(Inherited from Object)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

現在の Object の簡易コピーを作成します。

(Inherited from Object)
ToString() ToString() ToString() ToString()

現在のオブジェクトを表す文字列を返します。

(Inherited from Object)

適用対象

スレッド セーフ

すべてのパブリックおよびプロテクト メンバーCancellationTokenSourceスレッド セーフでは、例外として、複数のスレッドから同時に使用できますDispose()、ときに使用する必要がありますの他のすべての操作、CancellationTokenSourceオブジェクトが完了します。

こちらもご覧ください