Бөлісу құралы:


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, чтобы один обратный вызов, вызывающий исключение, не препятствовал выполнению других зарегистрированных обратных вызовов.

См. также раздел

Применяется к