CancellationToken Структура
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Распространяет уведомление о том, что операции должны быть отменены.
public value class CancellationToken
public value class CancellationToken : IEquatable<System::Threading::CancellationToken>
public struct CancellationToken
public readonly struct CancellationToken : IEquatable<System.Threading.CancellationToken>
public readonly struct CancellationToken
[System.Runtime.InteropServices.ComVisible(false)]
public struct CancellationToken
type CancellationToken = struct
[<System.Runtime.InteropServices.ComVisible(false)>]
type CancellationToken = struct
Public Structure CancellationToken
Public Structure CancellationToken
Implements IEquatable(Of CancellationToken)
- Наследование
- Атрибуты
- Реализации
Примеры
В следующем примере используется генератор случайных чисел для эмуляции приложения сбора данных, которое считывает 10 целочисленных значений из одиннадцати различных инструментов. Значение нуля указывает, что измерение завершилось сбоем для одного инструмента, в этом случае операция должна быть отменена, а общее значение не должно быть вычислено.
Для обработки возможной отмены операции пример создает 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 отмену между потоками, рабочими элементами пула потоков или Task объектами. Маркер отмены создается путем создания экземпляра CancellationTokenSource объекта, который управляет маркерами отмены, полученными из его CancellationTokenSource.Token свойства. Затем маркер отмены передается любому количеству потоков, задач или операций, которые должны получать уведомление об отмене. Маркер нельзя использовать для инициирования отмены. При вызове CancellationTokenSource.CancelIsCancellationRequested объекта владельцев свойство для каждой копии маркера отмены имеет значениеtrue. Объекты, получающие уведомление, могут реагировать любым образом.
Дополнительные сведения и примеры кода см. в разделе "Отмена" в управляемых потоках.
Конструкторы
| Имя | Описание |
|---|---|
| CancellationToken(Boolean) |
Инициализирует объект CancellationToken. |
Свойства
| Имя | Описание |
|---|---|
| CanBeCanceled |
Возвращает, может ли этот маркер находится в отмененном состоянии. |
| IsCancellationRequested |
Возвращает, запрашивается ли отмена для этого маркера. |
| None |
Возвращает пустое CancellationToken значение. |
| WaitHandle |
WaitHandle Получает сигнал, который сигнализирует при отмене маркера. |
Методы
| Имя | Описание |
|---|---|
| Equals(CancellationToken) |
Определяет, равен ли текущий CancellationToken экземпляр указанному маркеру. |
| Equals(Object) |
Определяет, равен ли текущий CancellationToken экземпляр указанному.Object |
| GetHashCode() |
Служит хэш-функцией для .CancellationToken |
| Register(Action, Boolean) |
Регистрирует делегат, который будет вызываться при отмене.CancellationToken |
| Register(Action) |
Регистрирует делегат, который будет вызываться при отмене.CancellationToken |
| Register(Action<Object,CancellationToken>, Object) |
Регистрирует делегат, который будет вызываться при отмене этого отмены CancelToken . |
| Register(Action<Object>, Object, Boolean) |
Регистрирует делегат, который будет вызываться при отмене.CancellationToken |
| Register(Action<Object>, Object) |
Регистрирует делегат, который будет вызываться при отмене.CancellationToken |
| ThrowIfCancellationRequested() |
Создает исключение, OperationCanceledException если этот маркер запросил отмену. |
| UnsafeRegister(Action<Object,CancellationToken>, Object) |
Регистрирует делегат, который будет вызываться при отмене этого отмены CancelToken . |
| UnsafeRegister(Action<Object>, Object) |
Регистрирует делегат, который вызывается при отмене.CancellationToken |
Операторы
| Имя | Описание |
|---|---|
| Equality(CancellationToken, CancellationToken) |
Определяет, равны ли два CancellationToken экземпляра. |
| Inequality(CancellationToken, CancellationToken) |
Определяет, равны ли два CancellationToken экземпляра. |
Применяется к
Потокобезопасность
Все общедоступные и защищенные элементы CancellationToken являются потокобезопасными и могут использоваться одновременно из нескольких потоков.