CancellationTokenSource Klas

Definitie

Signalen voor een CancellationToken die moet worden geannuleerd.

public ref class CancellationTokenSource : IDisposable
public ref class CancellationTokenSource sealed : IDisposable
public class CancellationTokenSource : IDisposable
[System.Runtime.InteropServices.ComVisible(false)]
public sealed class CancellationTokenSource : IDisposable
[System.Runtime.InteropServices.ComVisible(false)]
public class CancellationTokenSource : IDisposable
type CancellationTokenSource = class
    interface IDisposable
[<System.Runtime.InteropServices.ComVisible(false)>]
type CancellationTokenSource = class
    interface IDisposable
Public Class CancellationTokenSource
Implements IDisposable
Public NotInheritable Class CancellationTokenSource
Implements IDisposable
Overname
CancellationTokenSource
Kenmerken
Implementeringen

Voorbeelden

In het volgende voorbeeld wordt een generator voor willekeurige getallen gebruikt om een toepassing voor gegevensverzameling te emuleren die 10 integrale waarden van elf verschillende instrumenten leest. Een waarde van nul geeft aan dat de meting is mislukt voor één instrument, in welk geval de bewerking moet worden geannuleerd en er geen algemeen gemiddelde moet worden berekend.

Als u de mogelijke annulering van de bewerking wilt afhandelen, wordt in het voorbeeld een CancellationTokenSource object geïnstitueerd dat een annuleringstoken genereert dat wordt doorgegeven aan een TaskFactory object. Het TaskFactory object geeft het annuleringstoken op zijn beurt door aan elk van de taken die verantwoordelijk zijn voor het verzamelen van leeswaarden voor een bepaald instrument. De TaskFactory.ContinueWhenAll<TAntecedentResult,TResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>[],TResult>, CancellationToken) methode wordt aangeroepen om ervoor te zorgen dat het gemiddelde pas wordt berekend nadat alle metingen zijn verzameld. Als een taak niet is voltooid omdat deze is geannuleerd, genereert de aanroep naar de TaskFactory.ContinueWhenAll methode een uitzondering.

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.

Opmerkingen

Vanaf het .NET Framework 4 gebruikt het .NET Framework een uniform model voor het opzeggen van asynchrone of langlopende synchrone bewerkingen waarbij twee objecten zijn betrokken:

Het algemene patroon voor het implementeren van het samenwerkingsannuleringsmodel is:

Zie Annulering in Beheerde threadsvoor meer informatie.

Important

Met dit type wordt de IDisposable interface geïmplementeerd. Wanneer u klaar bent met het gebruik van een exemplaar van het type, moet u deze direct of indirect verwijderen. Als u het type rechtstreeks wilt verwijderen, roept u de Dispose methode aan in een try/finally blok. Als u deze indirect wilt verwijderen, gebruikt u een taalconstructie zoals using (in C#) of Using (in Visual Basic). Zie de sectie 'Using an Object that Implements IDisposable' (Een object gebruiken dat IDisposable implementeert) in het IDisposable interfaceonderwerp voor meer informatie.

Constructors

Name Description
CancellationTokenSource()

Initialiseert een nieuw exemplaar van de CancellationTokenSource klasse.

CancellationTokenSource(Int32)

Initialiseert een nieuw exemplaar van de CancellationTokenSource klasse die wordt geannuleerd na de opgegeven vertraging in milliseconden.

CancellationTokenSource(TimeSpan, TimeProvider)

Initialiseert een nieuw exemplaar van de CancellationTokenSource klasse die wordt geannuleerd na de opgegeven TimeSpan.

CancellationTokenSource(TimeSpan)

Initialiseert een nieuw exemplaar van de CancellationTokenSource klasse die na de opgegeven periode wordt geannuleerd.

Eigenschappen

Name Description
IsCancellationRequested

Hiermee wordt aangegeven of annulering hiervoor is aangevraagd CancellationTokenSource.

Token

Hiermee haalt u de CancellationToken bijbehorende CancellationTokenSource.

Methoden

Name Description
Cancel()

Communiceert een verzoek om annulering.

Cancel(Boolean)

Hiermee wordt een aanvraag voor annulering gecommuniceerd en wordt aangegeven of resterende callbacks en annuleringsbewerkingen moeten worden verwerkt als er een uitzondering optreedt.

CancelAfter(Int32)

Hiermee wordt een annuleringsbewerking gepland na CancellationTokenSource het opgegeven aantal milliseconden.

CancelAfter(TimeSpan)

Hiermee wordt een annuleringsbewerking gepland na CancellationTokenSource de opgegeven periode.

CancelAsync()

Communiceert asynchroon een aanvraag voor annulering.

CreateLinkedTokenSource(CancellationToken, CancellationToken)

Hiermee maakt u een CancellationTokenSource status die wordt geannuleerd wanneer een van de brontokens de status Geannuleerd heeft.

CreateLinkedTokenSource(CancellationToken)

Hiermee maakt u een CancellationTokenSource status die wordt geannuleerd wanneer het opgegeven token de status Geannuleerd heeft.

CreateLinkedTokenSource(CancellationToken[])

Hiermee maakt u een CancellationTokenSource status die wordt geannuleerd wanneer een van de brontokens in de opgegeven matrix de status Geannuleerd heeft.

CreateLinkedTokenSource(ReadOnlySpan<CancellationToken>)

Hiermee maakt u een CancellationTokenSource status die wordt geannuleerd wanneer een van de brontokens de status Geannuleerd heeft.

Dispose()

Alle resources die door het huidige exemplaar van de CancellationTokenSource klasse worden gebruikt, worden vrijgegeven.

Dispose(Boolean)

Publiceert de niet-beheerde resources die door de CancellationTokenSource klasse worden gebruikt en brengt eventueel de beheerde resources vrij.

Equals(Object)

Bepaalt of het opgegeven object gelijk is aan het huidige object.

(Overgenomen van Object)
GetHashCode()

Fungeert als de standaardhashfunctie.

(Overgenomen van Object)
GetType()

Hiermee haalt u de Type huidige instantie op.

(Overgenomen van Object)
MemberwiseClone()

Hiermee maakt u een ondiepe kopie van de huidige Object.

(Overgenomen van Object)
ToString()

Retourneert een tekenreeks die het huidige object vertegenwoordigt.

(Overgenomen van Object)
TryReset()

Hiermee wordt geprobeerd de CancellationTokenSource te gebruiken bewerking opnieuw in te stellen voor een niet-gerelateerde bewerking.

Van toepassing op

Veiligheid thread

Alle openbare en beveiligde leden van CancellationTokenSource zijn thread-veilig en kunnen gelijktijdig worden gebruikt vanuit meerdere threads, met uitzondering van Dispose(), die alleen mogen worden gebruikt wanneer alle andere bewerkingen op het CancellationTokenSource object zijn voltooid.

Zie ook