private static void TaskCancelDemo()
{
//向应该被取消的 System.Threading.CancellationToken 发送信号
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); //将在线程池上运行的指定工作排队,并返回代表该工作的 Task(TResult) 对象。 借助取消标记,可取消工作。
//以异步方式执行的工作量。应用以取消工作的取消标记。
Task<int> task = Task.Run(() => Sum(cancellationTokenSource.Token, ), cancellationTokenSource.Token); Thread.Sleep();
//Thread.Sleep(1); //传达取消请求
//这是异步请求,Task可能未完成也可能已经完成
cancellationTokenSource.Cancel(); try
{
//若任务已取消,则Result会抛出AggregateException
Console.WriteLine("Sum is " + task.Result);
}
catch (AggregateException aggregateException)
{
//捕获方式一
//如果是OperationCanceledException,则返回true,表示已处理该异常
//如果不是,则返回false,表示该异常未处理,会抛出一个新的AggregateException
//aggregateException.Handle(handle => handle is OperationCanceledException); //捕获方式二
//首先设置永远返回true,表示所有异常已处理,不再新抛出
aggregateException.Handle(handle =>
{
//将任何OperationCanceledException对象都视为已处理(打印输出)
if (handle is OperationCanceledException)
{
Console.WriteLine("Sum was cancelled.");
}
else//如果不是OperationCanceledException,则也已处理(打印输出)
{
Console.WriteLine(aggregateException.Message);
foreach (var e in aggregateException.InnerExceptions)
{
Console.WriteLine(e.Message);
}
} //注:若返回false,则其它(OperationCanceledException除外,因为上面已经处理过)
//任何异常都造成抛出一个新的AggregateException
//若返回true,则已处理异常,不再抛出(即使包含未处理的异常)
return true;
}); //所有异常都处理完成后,执行下面的代码
Console.WriteLine("All exceptions are handled.");
}
} /// <summary>
/// n以内正整数求和
/// </summary>
/// <param name="cancellationToken">取消操作的通知</param>
/// <param name="n"></param>
/// <returns></returns>
private static int Sum(CancellationToken cancellationToken, int n)
{
int sum = ;
for (; n > ; n--)
{
//在取消标识引用的CancellationTokenSource上调用Cancel
//如果已请求取消此标记,则引发 System.OperationCanceledException
cancellationToken.ThrowIfCancellationRequested(); //检查n值,若太大,则抛出OverflowException
checked { sum = sum + n; }
}
return sum;
}     在创建Task时将一个CancellationToken传给构造器(如上例所示),从而将两者关联。但是,虽然Task对象关联了一个CancellationToken,但却没有办法访问它。因此,必须在Task的代码中获得创建Task对象时的同一个CancellationToken。为此,最简单的办法就是使用一个lambda表达式,将CancellationToken作为闭包变量“传递”(如上例所示)。如果CancellationToken在Task调度前取消(会抛出InvalidOperationException),Task会被取消,永远都不执行。但如果Task已调度(通过Start,或者Run,静态Run方法会自动创建Task对象并立即调用Start),那么Task的代码只有显式支持取消,其操作才能在执行期间取消。

最新文章

  1. viewgager
  2. testdb11b root.sh执行结果
  3. js localStorage 设置和取值
  4. 使用 KGDB 调试 Kernel On Red Hat Linux
  5. 科蓝软件急招前端开发、PHP、.NET工程师
  6. C# 常用分页
  7. iOS MD5加密字符串
  8. List&lt;T&gt; please check srcIndex
  9. MySQL的基本使用
  10. C#基础拾遗系列之二:C#7.0新增功能点
  11. [WinForm]dataGridView动态加载以本地图片显示列
  12. MySQL拓展操作
  13. 怎么样使用CLion调试分析MySQL Server
  14. CAS的应用场景
  15. SICP读书笔记 1.1
  16. WinForm1
  17. vue elementui switch开关控件的使用
  18. 构造HTTP请求Header实现“伪造来源IP”(转)
  19. thinkPHP写txt日志文件
  20. delphi 事务处理SQL语句

热门文章

  1. C#.NET中对称和非对称加密、解密方法汇总--亲测可用
  2. 【笔记】Docker入门
  3. .net 开源 FTP 组件 edtFTPnet
  4. 使用kubeadm安装kubernetes1.12.2版本脚本【h】
  5. 利用canvas对图片进行切割
  6. 利用sklearn的Pipeline简化建模过程
  7. 【DSP开发】gel文件编写
  8. Archlinux开启ssh服务命令
  9. Ubuntu 下几种软件安装的方法小结
  10. DL4J中文文档/Keras模型导入/函数模型