Nyelv

CancellationTokenSource Osztály

Definíció

Azt jelzi CancellationToken , hogy meg kell szakítani.

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
Öröklődés
CancellationTokenSource
Attribútumok
Megvalósítás

Példák

Az alábbi példa egy véletlenszerű számgenerátort használ egy adatgyűjtési alkalmazás emulálásához, amely 10 integrál értéket olvas be tizenegy különböző eszközből. A nulla érték azt jelzi, hogy a mérés egy eszköz esetében meghiúsult, ebben az esetben a műveletet le kell mondani, és nincs szükség általános középérték kiszámítására.

A művelet lehetséges lemondásának kezeléséhez a példa létrehoz egy CancellationTokenSource objektumot, amely létrehoz egy lemondási jogkivonatot, amelyet egy objektumnak TaskFactory ad át. Az TaskFactory objektum viszont átadja a lemondási jogkivonatot minden olyan feladatnak, amely egy adott eszköz leolvasásainak gyűjtéséért felelős. A TaskFactory.ContinueWhenAll<TAntecedentResult,TResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>[],TResult>, CancellationToken) metódus azért van meghívva, hogy a középérték csak az összes olvasás sikeres összegyűjtése után legyen kiszámítva. Ha egy tevékenység nem fejeződött be, mert megszakadt, a metódus hívása TaskFactory.ContinueWhenAll kivételt eredményez.

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.

Megjegyzések

A .NET Framework 4-től kezdve a .NET-keretrendszer egységes modellt használ az aszinkron vagy hosszan futó szinkron műveletek együttműködésen alapuló törléséhez, amely két objektumot foglal magában:

A szövetkezeti lemondási modell megvalósításának általános mintája:

  • Példányosít egy CancellationTokenSource objektumot, amely kezeli és elküldi a törlési értesítést az egyes törlési tokeneknek.

  • Adja át a CancellationTokenSource.Token tulajdonság által visszaadott jogkivonatot minden olyan tevékenységnek vagy szálnak, amely a megszakítást figyeli.

  • Hívja meg a metódust a CancellationToken.IsCancellationRequested lemondási jogkivonatot fogadó műveletektől. Adjon meg egy mechanizmust minden tevékenységhez vagy szálhoz a lemondási kérelmek megválaszolásához. Attól függ, hogy megszakít-e egy műveletet, és pontosan hogyan hajtja végre, az alkalmazáslogikától függ.

  • A lemondásról szóló értesítés megadásához hívja meg a CancellationTokenSource.Cancel metódust. Ez a tulajdonság a CancellationToken.IsCancellationRequested lemondási jogkivonat minden másolatán a következőre állítja be a tulajdonságot true: .

  • Hívja meg a Dispose metódust, ha végzett az CancellationTokenSource objektummal.

További információ: Lemondás felügyelt szálakban.

Important

Ez a típus implementálja a IDisposable felületet. Ha befejezte a típus használatát, közvetlenül (a metódus meghívásával) vagy közvetetten (például using a C#-ban) kell elhelyeznie Dispose a típust. További információ: Az IDisposable-t megvalósító objektum használata.

Konstruktorok

Name Description
CancellationTokenSource()

Inicializálja a CancellationTokenSource osztály új példányát.

CancellationTokenSource(Int32)

Inicializálja az CancellationTokenSource osztály új példányát, amelyet a megadott késleltetés után ezredmásodpercben megszakítunk.

CancellationTokenSource(TimeSpan, TimeProvider)

Inicializálja az osztály új példányát, amely a CancellationTokenSource megadott TimeSpanután megszakad.

CancellationTokenSource(TimeSpan)

Inicializálja az CancellationTokenSource osztály új példányát, amely a megadott időtartomány után megszakad.

Tulajdonságok

Name Description
IsCancellationRequested

Lekérdezi, hogy a lemondást kérték-e ehhez CancellationTokenSource.

Token

Lekéri a CancellationToken társított elemet.CancellationTokenSource

Metódusok

Name Description
Cancel()

A lemondási kérelmet közli.

Cancel(Boolean)

Közli a lemondási kérelmet, és meghatározza, hogy a fennmaradó visszahívásokat és a visszavonható műveleteket fel kell-e dolgozni kivétel esetén.

CancelAfter(Int32)

A megadott számú ezredmásodperc után ütemezi a CancellationTokenSource megszakítási műveletet.

CancelAfter(TimeSpan)

A megadott időtartam után ütemezi a CancellationTokenSource megszakítási műveletet.

CancelAsync()

Aszinkron módon közli a lemondási kérelmet.

CreateLinkedTokenSource(CancellationToken, CancellationToken)

Létrehoz egy CancellationTokenSource olyan értéket, amely megszakított állapotban lesz, amikor a forrásjogkivonatok bármelyike megszakított állapotban van.

CreateLinkedTokenSource(CancellationToken)

Létrehoz egy CancellationTokenSource törölt állapotban lévőt, amikor a megadott jogkivonat megszakított állapotban van.

CreateLinkedTokenSource(CancellationToken[])

Létrehoz egy CancellationTokenSource törölt állapotot, ha a megadott tömbben lévő forrás jogkivonatok bármelyike megszakított állapotban van.

CreateLinkedTokenSource(ReadOnlySpan<CancellationToken>)

Létrehoz egy CancellationTokenSource olyan értéket, amely megszakított állapotban lesz, amikor a forrásjogkivonatok bármelyike megszakított állapotban van.

Dispose()

Az osztály aktuális példánya által használt összes erőforrást felszabadítja CancellationTokenSource .

Dispose(Boolean)

Felszabadítja az osztály által CancellationTokenSource használt nem felügyelt erőforrásokat, és opcionálisan felszabadítja a felügyelt erőforrásokat.

Equals(Object)

Meghatározza, hogy a megadott objektum egyenlő-e az aktuális objektummal.

(Öröklődés forrása Object)
GetHashCode()

Ez az alapértelmezett kivonatoló függvény.

(Öröklődés forrása Object)
GetType()

Lekéri az Type aktuális példányt.

(Öröklődés forrása Object)
MemberwiseClone()

Az aktuális Objectpéldány sekély másolatát hozza létre.

(Öröklődés forrása Object)
ToString()

Az aktuális objektumot jelképező sztringet ad vissza.

(Öröklődés forrása Object)
TryReset()

Megkísérli visszaállítani a CancellationTokenSource nem kapcsolódó művelethez használni kívánt műveletet.

A következőre érvényes:

Szálbiztonság

A nyilvános és védett tagok CancellationTokenSource szálbiztosak, és egyidejűleg több szálból is használhatók, kivéve Dispose()azt a lehetőséget, amelyet csak akkor szabad használni, ha az CancellationTokenSource objektum összes többi művelete befejeződött.

Lásd még