語言

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 物件,產生一個消去標記,並傳達給物件 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.

備註

關聯的 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 時不要拋出例外。

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

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

另請參閱

適用於