CancellationTokenSource Osztály
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
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:
Egy CancellationTokenSource objektum, amely egy lemondási jogkivonatot biztosít a tulajdonságán Token keresztül, és lemondási üzenetet küld annak vagy Cancel metódusának CancelAfter meghívásával.
Egy CancellationToken objektum, amely azt jelzi, hogy a rendszer kéri-e a lemondást.
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.