C# 4.0才有,4.0以下的不用试。

 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.  
  6. using System.Threading.Tasks;  
  7. using System.Threading;  
  8.  
  9. namespace TaskDemo  
  10. {  
  11.     class Program  
  12.     {  
  13.         static void Main(string[] args)  
  14.         {  
  15.             try 
  16.             {  
  17.                 int mCount = 0;  
  18.  
  19.                 CancellationTokenSource tokenSource = new CancellationTokenSource();  
  20.                 CancellationToken token = tokenSource.Token;  
  21.  
  22.                 Task t = new Task(() =>  
  23.                 {  
  24.                     Thread.Sleep(1000);  
  25.                     Console.WriteLine("任务开始工作……");  
  26.                     //模拟工作过程     
  27.                     for (int i = 0; i < 3000; i++)  
  28.                     {  
  29.                         if (token.IsCancellationRequested == true)  
  30.                         {  
  31.                             break;          //这里别人是用一个throw new OperationCanceledException(token); 但是我用就会报错  
  32.                         }  
  33.                         mCount++;  
  34.                         Thread.Sleep(1);   
  35.                     }  
  36.                 }, token);  
  37.                 token.Register(() =>  
  38.                {      
  39.  
  40.                    Console.WriteLine("Canceled");  
  41.  
  42.                });  
  43.                 t.Start();  
  44.                 Console.WriteLine("这条语句先运行完毕了……");  
  45.                 t.ContinueWith((task) =>  
  46.                 {  
  47.                     Console.WriteLine("任务完成,完成时候的状态为:");  
  48.                     Console.WriteLine("IsCanceled={0}\tIsCompleted={1}\tIsFaulted={2}\tmCount={3}", task.IsCanceled, task.IsCompleted, task.IsFaulted, mCount);  
  49.                 });  
  50.                 Console.WriteLine("现在就按任意键的话,程序就退出了……");  
  51.                 Console.ReadKey();      //由于两个sleep都有点时间,如果在这时间之前按下任意键,结果是程序提前终止了  
  52.                 tokenSource.Cancel();  
  53.                 Console.ReadKey();      //程序退出  
  54.  
  55.             }  
  56.             catch (Exception Ex)  
  57.             {  
  58.                 Console.WriteLine(Ex.Message);  
  59.             }  
  60.  
  61.         }  
  62.     }  
  63. }  
  64.  
  65.  
  66.  
  67.