C#-Task任务取消
1 static void Main(string[] args) 2 { 3 4 var tasks = new List<Task<int>>(); 5 CancellationTokenSource source = new CancellationTokenSource(); 6 CancellationToken token = source.Token; 7 // Define a delegate that prints and returns the system tick count 8 Func<object, int> action = (object obj) => 9 { 10 int i = (int)obj; 11 12 // Make each thread sleep a different time in order to return a different tick count 13 Thread.Sleep(i * 100); 14 15 // The tasks that receive an argument between 2 and 5 throw exceptions 16 if (2 <= i && i <= 5) 17 { 18 if (token.IsCancellationRequested) 19 token.ThrowIfCancellationRequested(); 20 //source.Cancel(); 21 // if (token.IsCancellationRequested) 22 // 23 // throw new AggregateException("SIMULATED EXCEPTION"); 24 } 25 26 int tickCount = Environment.TickCount; 27 Console.WriteLine("Task={0}, i={1}, TickCount={2}, Thread={3}", Task.CurrentId, i, tickCount, Thread.CurrentThread.ManagedThreadId); 28 29 return tickCount; 30 }; 31 32 // Construct started tasks 33 for (int i = 0; i < 10; i++) 34 { 35 int index = i; 36 //tasks.Add(Task<int>.Factory.StartNew(action, index, source.Token)); 37 if (2 <= i && i <= 5) 38 { 39 tasks.Add(Task<int>.Factory.StartNew(action, index, source.Token)); 40 } 41 else { 42 tasks.Add(Task<int>.Factory.StartNew(action, index)); 43 } 44 45 } 46 47 try 48 { 49 // Wait for all the tasks to finish. 50 // 51 // 52 Task.WaitAny(tasks.ToArray()); 53 source.Cancel(); 54 Thread.Sleep(5000); 55 56 foreach (var t in tasks) 57 { 58 Console.WriteLine(" Task {0}: {1}", t.Id, t.Status); 59 } 60 // We should never get to this point 61 Console.WriteLine("WaitAll() has not thrown exceptions. THIS WAS NOT EXPECTED."); 62 } 63 catch (AggregateException e) 64 { 65 foreach (Exception ea in e.InnerExceptions) 66 { 67 if (ea is TaskCanceledException) 68 Console.WriteLine("Unable to compute mean: {0}", 69 ((TaskCanceledException)ea).Message); 70 else 71 Console.WriteLine("Exception: " + e.GetType().Name); 72 } 73 Console.WriteLine("\nThe following exceptions have been thrown by WaitAll(): (THIS WAS EXPECTED)"); 74 for (int j = 0; j < e.InnerExceptions.Count; j++) 75 { 76 Console.WriteLine("\n-------------------------------------------------\n{0}", e.InnerExceptions[j].ToString()); 77 } 78 } 79 finally 80 { 81 source.Dispose(); 82 } 83 }