多线程的异常处理、线程取消、临时变量、lock
异步多线程的异常,抓不到,因为是在子线程执行。
#region 多线程的异常处理、线程取消、临时变量、lock
{
try
{
List<Task> list = new List<Task>();
TaskFactory taskFactory = new TaskFactory();
//取消线程
CancellationTokenSource cts = new CancellationTokenSource();
for (int i = ; i < ; i++)
{
string name = "task" + i;
//无参数,无返回值的一个委托
Action act = new Action(() =>
{
try
{
if (name == "task4")
{
throw new Exception("抛出异常信息");
}
Thread.Sleep();
//检查Task是否被取消了
if (cts.IsCancellationRequested)
{
Console.WriteLine(name + " 被取消:" + cts.IsCancellationRequested);
}
else
{
Console.WriteLine(name + " 执行成功");
}
}
catch (Exception ex)
{
cts.Cancel();//取消,所有子线程都会被取消
Console.WriteLine("子线程异常:{0}", ex.Message);
}
}); Task task = taskFactory.StartNew(act, cts.Token);
list.Add(task);
//cts.Token是一个标识,用来标记线程是否已经被取消了
//输出结果
//子线程异常:抛出异常信息
//task2 被取消:True
//task1 被取消:True
//task3 被取消:True
//task0 被取消:True
}
Task.WaitAll(list.ToArray());
}
catch (AggregateException ex)
{
foreach (var item in ex.InnerExceptions)
{
Console.WriteLine(item.Message);
}
} }
#endregion #region 多线程延迟问题
{
Action<int> act = new Action<int>(t =>
{
Thread.Sleep();
Console.WriteLine(t);
});
for (int i = ; i < ; i++)
{
//Task.Run 需要接受 无参数、无返回值 的Action,所以需要包装一下
//会出现错误,输出的全部是 10,因为Task.Run去申请线程后并没有立即执行,当执行的时候for循环已经结束,i已经变成10了
//Task.Run(() => act(i)); //解决方法,每次循环都会创建一个新的变量k,执行的时候引用的是当时的k
int k = i;
Task.Run(() => act(k));
}
}
#endregion
多线程的异常处理、线程取消、临时变量、lock的更多相关文章
- C# 多线程总结 异常处理 线程取消 锁(lock)
那么什么时候能用多线程? 任务能并发的时候 多线程能干嘛?提升速度/优化用户体验 网站首页:A数据库 B接口 C分布式服务 D搜索引擎,适合多线程并发,都完成后才能返回给用户,需要等待WaitAll列 ...
- 20181106_线程之异常_取消_变量_安全Lock
一. 线程的异常处理: try { TaskFactory taskFactory = new TaskFactory(); List<Task> taskList = new List& ...
- .NET 异步多线程,Thread,ThreadPool,Task,Parallel,异常处理,线程取消
今天记录一下异步多线程的进阶历史,以及简单的使用方法 主要还是以Task,Parallel为主,毕竟用的比较多的现在就是这些了,再往前去的,除非是老项目,不然真的应该是挺少了,大概有个概念,就当了解一 ...
- .NET异步多线程,Thread,ThreadPool,Task,Parallel,异常处理,线程取消
今天记录一下异步多线程的进阶历史,以及简单的使用方法 主要还是以Task,Parallel为主,毕竟用的比较多的现在就是这些了,再往前去的,除非是老项目,不然真的应该是挺少了,大概有个概念,就当了解一 ...
- Java多线程:线程间通信之Lock
Java 5 之后,Java在内置关键字sychronized的基础上又增加了一个新的处理锁的方式,Lock类. 由于在Java线程间通信:volatile与sychronized中,我们已经详细的了 ...
- 线程系列07,使用lock语句块或Interlocked类型方法保证自增变量的数据同步
假设多个线程共享一个静态变量,如果让每个线程都执行相同的方法每次让静态变量自增1,这样的做法线程安全吗?能保证自增变量数据同步吗?本篇体验使用lock语句块和Interlocked类型方法保证自增变量 ...
- posix多线程--线程取消
1.三种取消状态Off 禁用取消Deferred 推迟取消:在下一个取消点执行取消Asynchronous 异步取消:可以随时执行取消 in ...
- -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中
本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait( ...
- .net 多线程之线程取消
//线程取消不是操作线程,而是操作信号量(共享变量,多个线程都能访问到的东西,变量/数据库的数据/硬盘数据) //每个线程在执行的过程中,经常去查看下这个信号量,然后自己结束自己 //线程不能别人终止 ...
随机推荐
- C++ new 和malloc 区别
1.分配地方不同,malloc是堆上面,new是自由存储区域 2.malloc/delete是函数,new/delete是操作符,可以重载 3.malloc 要指定大小,返回的是void*指针,开辟的 ...
- Aop 中 JoinPoint等对象的用法Api
@Aspect 定义类为切入类 @Pointcut 声明一个切入策略供 @Before @After @ Around @ AfterReturning选择 @Before 被切入方法执行前执行 @A ...
- 限制ssh登录ip和系统用户
一般对于安全性要求比较高的系统,限制ssh登录的源ip地址和可以登录的系统账户是非常有必要的,ssh登录的源地址和可以登录的系统账户的设置在sshd的配置文件/etc/ssh/sshd_config中 ...
- linux最大允许的文件描述符open files数nofile修改
open file resource limit 是linux中process可以打开的文件句柄数量.增加这个数值需要调整两个配置: 第一步, 修改系统最大允许的文件描述符 查看当前的设置: $ ca ...
- iphone上实现H264 硬编码
供ios下h264硬编码sdk,可以生成h264流. 我们的H264 SDK提供了一个理想的软件开发工具包,使您的app可以在iPhone或iPod上实时的访问H264帧数据.SDK提供了一套API功 ...
- 初始C语言中的数组(男神翁凯老师MOOC)
定义数组 ●<类型>变量名称[元素数量]; ● int grades[100]; ●double weight[20]; ●元素数量必须是整数 ●C99之前:元素数量必须是编译时刻确定的字 ...
- 运用active和hover实现导航栏的页面切换
.nav ul li a:hover{ background: #3E6EDD;}.nav ul li a:hover img{ display: block;}.nav ul li a.active ...
- hive mysql 初始化
原文链接:https://juejin.im/post/59c3f8f75188255be81f91d9#heading-17 Apache Hive-2.3.0 快速搭建与使用 Hive 简介 Hi ...
- spring boot IDEA 开发微服务
本文是参考:https://blog.csdn.net/u011001084/article/details/79040701 的基础上自己实际操作编写. 在我们开始创建微服务之前,需要安装Cons ...
- python学习day9 字符编码和文件处理
1.字符编码 x='上' #unicode的二进制--------->编码-------->gbk格式的二进制 res=x.encode('gbk') #bytes 字节类型 print( ...