CancellationTokenSource.Cancel 方法

定義

傳達取消的要求。

多載

名稱 Description
Cancel()

傳達取消的要求。

Cancel(Boolean)

傳達取消的要求,並指定例外狀況發生時,是否應該處理剩餘的回呼和可取消的作業。

Cancel()

來源:
CancellationTokenSource.cs
來源:
CancellationTokenSource.cs
來源:
CancellationTokenSource.cs
來源:
CancellationTokenSource.cs
來源:
CancellationTokenSource.cs

傳達取消的要求。

public:
 void Cancel();
public void Cancel();
member this.Cancel : unit -> unit
Public Sub Cancel ()

例外狀況

一個包含所有註冊回撥 CancellationToken拋出的異常的彙總例外。

範例

下列範例會使用隨機數產生器來模擬數據收集應用程式,以從11個不同儀器讀取10個整數值。 值為零表示一個儀器的測量失敗,在此情況下應該取消作業,而且不應計算整體平均數。

為了處理操作可能的消去,範例實例化一個 CancellationTokenSource 物件,產生一個消去標記,並傳達給物件 TaskFactoryTaskFactory物件再將消除標記傳遞給負責收集特定儀器讀數的任務。 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.

備註

關聯的 Associated CancellationToken 會收到取消通知,並轉換到一個回 IsCancellationRequested 傳 true 的狀態。

任何在 CancellationToken 中註冊的回調或可取消操作,如果之前尚未被 的呼叫 Cancel()執行,則會被執行。 後續呼叫 Cancel() 不會再次執行相同的回撥,除非重新註冊。 (避免多次呼叫 Cancel(),因為此類程式碼的意圖通常不明確。)

回調以 LIFO 順序同步執行。

我們建議可取消操作與回撥註冊 CancellationToken 時不要拋出例外。

這種 Cancel 的超載會彙整拋入 的 AggregateException異常,使得一個回撥拋出例外不會阻止其他註冊回撥的執行。

呼叫此方法與呼叫 Cancel(false)的效果相同。

另請參閱

適用於

Cancel(Boolean)

來源:
CancellationTokenSource.cs
來源:
CancellationTokenSource.cs
來源:
CancellationTokenSource.cs
來源:
CancellationTokenSource.cs
來源:
CancellationTokenSource.cs

傳達取消的要求,並指定例外狀況發生時,是否應該處理剩餘的回呼和可取消的作業。

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

例外狀況

一個包含所有註冊回撥 CancellationToken拋出的異常的彙總例外。

備註

相關 CancellationToken 被通知取消,並轉換到一個狀態,返回 IsCancellationRequestedtrue

任何在 CancellationToken 中註冊的回調或可取消操作,如果之前尚未被 的呼叫 Cancel()執行,則會被執行。 後續呼叫 Cancel() 不會再次執行相同的回撥,除非重新註冊。 (避免多次呼叫 Cancel(),因為此類程式碼的意圖通常不明確。)

回調以 LIFO 順序同步執行。

我們建議可取消操作與回撥註冊 CancellationToken 時不要拋出例外。

throwOnFirstExceptiontrue,例外將立即從呼叫中傳播至 Cancel,阻止剩餘回調及可取消操作被處理。

throwOnFirstExceptionfalse,則此過載會彙整拋入 AggregateException的異常,使得一個回調拋出例外不會阻止其他註冊回撥的執行。

另請參閱

適用於