CancellationTokenSource.Cancel Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Передает запрос на отмену.
Перегрузки
Cancel() |
Передает запрос на отмену. |
Cancel(Boolean) |
Передает запрос отмены и определяет, будут ли последующие обратные вызовы и отменяемые операции обрабатываться при возникновении исключения. |
Cancel()
Передает запрос на отмену.
public:
void Cancel();
public void Cancel ();
member this.Cancel : unit -> unit
Public Sub Cancel ()
Исключения
Данный объект CancellationTokenSource был удален.
Статистическое исключение, содержащее все исключения, созданные зарегистрированными обратными вызовами на связанном 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 объект будет уведомлен об отмене и перейдет в состояние, в котором IsCancellationRequested возвращается значение true.
Будут выполнены все обратные вызовы или отменяемые операции, зарегистрированные в ней CancellationToken .
Рекомендуется отменять операции и обратные вызовы, зарегистрированные без CancellationToken исключения.
Эта перегрузка Cancel будет агрегировать все исключения, создаваемые в объекте AggregateException, чтобы один обратный вызов, вызывающий исключение, не препятствовал выполнению других зарегистрированных обратных вызовов.
Вызов этого метода имеет тот же эффект, что и вызов.Cancel(false)
См. также раздел
Применяется к
Cancel(Boolean)
Передает запрос отмены и определяет, будут ли последующие обратные вызовы и отменяемые операции обрабатываться при возникновении исключения.
public:
void Cancel(bool throwOnFirstException);
public void Cancel (bool throwOnFirstException);
member this.Cancel : bool -> unit
Public Sub Cancel (throwOnFirstException As Boolean)
Параметры
- throwOnFirstException
- Boolean
true
, если исключения нужно распространять немедленно; в противном случае — значение false
.
Исключения
Данный объект CancellationTokenSource был удален.
Статистическое исключение, содержащее все исключения, созданные зарегистрированными обратными вызовами на связанном CancellationToken.
Комментарии
Связанный CancellationToken объект будет уведомлен об отмене и перейдет в состояние, в IsCancellationRequested котором возвращается true
.
Будут выполнены все обратные вызовы или отменяемые операции, зарегистрированные в ней CancellationToken . Обратные вызовы будут выполняться синхронно в порядке LIFO.
Рекомендуется отменять операции и обратные вызовы, зарегистрированные без CancellationToken исключения.
В противном случае throwOnFirstException
true
исключение немедленно распространяется из вызова Cancel, предотвращая обработку оставшихся обратных вызовов и отменяемых операций.
Если throwOnFirstException
это false
так, эта перегрузка будет агрегировать все исключения, создаваемые в объекте AggregateException, чтобы один обратный вызов, вызывающий исключение, не препятствовал выполнению других зарегистрированных обратных вызовов.