C# 4.0才有,4.0以下的不用试。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Threading;
- namespace TaskDemo
- {
- class Program
- {
- static void Main(string[] args)
- {
- try
- {
- int mCount = 0;
- CancellationTokenSource tokenSource = new CancellationTokenSource();
- CancellationToken token = tokenSource.Token;
- Task t = new Task(() =>
- {
- Thread.Sleep(1000);
- Console.WriteLine("任务开始工作……");
- //模拟工作过程
- for (int i = 0; i < 3000; i++)
- {
- if (token.IsCancellationRequested == true)
- {
- break; //这里别人是用一个throw new OperationCanceledException(token); 但是我用就会报错
- }
- mCount++;
- Thread.Sleep(1);
- }
- }, token);
- token.Register(() =>
- {
- Console.WriteLine("Canceled");
- });
- t.Start();
- Console.WriteLine("这条语句先运行完毕了……");
- t.ContinueWith((task) =>
- {
- Console.WriteLine("任务完成,完成时候的状态为:");
- Console.WriteLine("IsCanceled={0}\tIsCompleted={1}\tIsFaulted={2}\tmCount={3}", task.IsCanceled, task.IsCompleted, task.IsFaulted, mCount);
- });
- Console.WriteLine("现在就按任意键的话,程序就退出了……");
- Console.ReadKey(); //由于两个sleep都有点时间,如果在这时间之前按下任意键,结果是程序提前终止了
- tokenSource.Cancel();
- Console.ReadKey(); //程序退出
- }
- catch (Exception Ex)
- {
- Console.WriteLine(Ex.Message);
- }
- }
- }
- }