c# Task编程一个task抛出异常后怎么取消其他线程
从MSDN的Forum上看到别人提供的解决方案,感觉还是比较靠谱,所以就保存下来。
CancellationTokenSource cts = new CancellationTokenSource();
Task t1 = Task.Factory.StartNew(() =>
{
if (!cts.IsCancellationRequested)
{
try
{
//task body that may throw
Console.WriteLine("Task1");
}
catch
{
cts.Cancel();
throw new OperationCanceledException(cts.Token); //the task final state will be Cancelled
//the exception can be ignored if needed
}
if (cts.IsCancellationRequested)
{
//depending on the scenario
//ignore any computed result, do not persist any data, revert all changes
}
}
}, cts.Token);
Task t2 = Task.Factory.StartNew(() =>
{
if (!cts.IsCancellationRequested)
{
try
{
//task body that may throw
Console.WriteLine("Task2");
}
catch
{
cts.Cancel();
throw new OperationCanceledException(cts.Token); //the task final state will be Cancelled
}
if (cts.IsCancellationRequested)
{
//depending on the scenario
//ignore any computed result, do not persist any data, revert all changes
}
}
}, cts.Token);
2. In case that you would like to avoid try/catch in every body you could use a Task Continuation approach like below. However with this approach, the application will pay the price of new tasks being created. At the same time the Cancellation will be delayed.
CancellationTokenSource cts = new CancellationTokenSource();
Task t1 = Task.Factory.StartNew(() =>
{
if (!cts.IsCancellationRequested)
{
//task body that may throw
Console.WriteLine("Task1");
if (cts.IsCancellationRequested)
{
//depending on the scenario
//ignore any computed result, do not persist any data, revert all changes
}
}
}, cts.Token).ContinueWith((task) =>
{
cts.Cancel();
//observe the exception
Exception ex = task.Exception;
}, TaskContinuationOptions.OnlyOnFaulted|TaskContinuationOptions.ExecuteSynchronously );
Task t2 = Task.Factory.StartNew(() =>
{
if (!cts.IsCancellationRequested)
{
//task body that may throw
Console.WriteLine("Task2");
if (cts.IsCancellationRequested)
{
//depending on the scenario
//ignore any computed result, do not persist any data, revert all changes
}
}
}, cts.Token).ContinueWith((task) =>
{
cts.Cancel();
//observe the exception
Exception ex = task.Exception;
}, TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.ExecuteSynchronously);
参考,转载:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/2cbe1fa7-c7dd-4e88-8773-2e3bb1665e2e/how-to-cancel-other-task-when-there-is-an-exception-in-one-of-the-task?forum=parallelextensions
c# Task编程一个task抛出异常后怎么取消其他线程的更多相关文章
- 转载 .Net多线程编程—任务Task https://www.cnblogs.com/hdwgxz/p/6258014.html
.Net多线程编程—任务Task 1 System.Threading.Tasks.Task简介 一个Task表示一个异步操作,Task的创建和执行是独立的. 只读属性: 返回值 名称 说明 ob ...
- .Net多线程编程—任务Task
1 System.Threading.Tasks.Task简介 一个Task表示一个异步操作,Task的创建和执行是独立的. 只读属性: 返回值 名称 说明 object AsyncState 表示在 ...
- java并发编程实战:第七章----取消与关闭
Java没有提供任何机制来安全地终止线程(虽然Thread.stop和suspend方法提供了这样的机制,但由于存在缺陷,因此应该避免使用 中断:一种协作机制,能够使一个线程终止另一个线程的当前工作 ...
- 一个 Task 不够,又来一个 ValueTask ,真的学懵了!
一:背景 1. 讲故事 前几天在项目中用 MemoryStream 的时候意外发现 ReadAsync 方法多了一个返回 ValueTask 的重载,真是日了狗了,一个 Task 已经够学了,又来一个 ...
- C#并发编程-2 异步编程基础-Task
一 异步延迟 在异步方法中,如果需要让程序延迟等待一会后,继续往下执行,应使用Task.Delay()方法. //创建一个在指定的毫秒数后完成的任务. public static Task Delay ...
- .NET 中 如果一个Task A正在await另一个Task B,那么Task A是什么状态
新建一个.NET Core控制台程序,输入如下代码: using System; using System.Threading; using System.Threading.Tasks; class ...
- c# 写着玩的,两个Task并发,一个写队列一个读队列的异常情况
class Program { class TestEnqueue { static Queue<string> str = new Queue<string>(); publ ...
- 临远大神,你为啥要建立一个 TASK表。HumanTaskDTO
临远大神,你为啥要建立一个 TASK表.HumanTaskDTO HumanTask这张表的作用是什么. 为了实现理想中的任务中心.TaskCenter. 首先,工作流可能会完全不包含任何人工节点,全 ...
- 【C# Task】 ValueTask/Task<TResult>
概要 1.如果异步方法的使用者使用 Task.WhenAll 或 Task.WhenAny,则在异步方法中使用 ValueTask<T> 作为返回类型可能会产生高昂的成本.这是因为您需要使 ...
随机推荐
- the computer spends over 96% of its time waiting for I/O devices to finish transferring data
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION
- garbage collection - 垃圾收集
Professional.JavaScript.for.Web.Developers.3rd.Edition.Jan.2012 JavaScript is a garbage-collected la ...
- P2409 Y的积木
luogu月赛 暴力dfs,估计过不了几个点,大概也就得30分左右? #include <bits/stdc++.h> using namespace std; const int max ...
- Finally 与 return
网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下fina ...
- java.lang.ClassNotFoundException: springosgi
该问题困扰多天,终于查到原因. 问题:对webwork源码的修改始终无法加载,osgi总是读取源码中未修改的类 com.opensymphony.webwork.dispatcher.Dispatch ...
- (IOS)Swift Music 程序分析
本文主要分享下楼主在学习Swift编程过程中,对GitHub上的一个开源App Swift Music的研究心得. 项目地址:https://github.com/xujiyao123/SwiftMu ...
- Asp.Net ORM
Entity Framework https://msdn.microsoft.com/zh-cn/data/jj193542 NuGet命令获取组件方式: 键入“get-help NuGet”以查看 ...
- Mac下安装和配置mongoDB
mac下的mongodb下载安装比较简单,主要有两种方式,一种是下载压缩包解压,另一种是通过npm或者homebrew命令安装,这里就不赘述了, 复杂的在于mongodb运行环境的配置(若未配置运行环 ...
- ionic 报错%1 is not a valid Win32 application
Fixed the problem by installing python version 3.0 and above will do下载Python3.0或以上版本 python官网传送门:htt ...
- 安装Win7或者XP系统用虚拟光驱加载Win7或者XP镜像 iso文件xp win7wim文件
安装Win7或者XP系统用虚拟光驱加载Win7或者XP镜像 iso文件xp win7wim文件 http://pcedu.pconline.com.cn/teach/xt/1201/2657834_8 ...