多线程的异常处理、线程取消、临时变量、lock
2024-09-09 19:41:42
异步多线程的异常,抓不到,因为是在子线程执行。
#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
最新文章
- MVC CodeFirst简单的创建数据库(非常详细的步骤)
- thinkphp系统常量与自定义常量
- c#图片输出
- Swift Internal Parameter and External Parameter 外部参数和内部参数
- mysql max_allowed_packet自动重置为1024 终结解决
- GUI图形界面
- HW5.36
- EventBus使用小记
- 【转】【已解决】Android中ActionBar中不显示overflow(就是三个点的那个按钮)--不错
- Go语言的构建方法总结
- windows 下一个mysql password忘记改变
- MongoDB学习总结(五) —— 安全认证
- Github 开源:升讯威 Winform 开源控件库( Sheng.Winform.Controls)
- SUSE-11 本地 zypper 配置
- js 个人笔记
- MySQL8.0关于caching_sha2_password Plugin的一个Bug
- spring cloud 实践之hystrix注意事项
- The Guardian’s Migration from MongoDB to PostgreSQL on Amazon RDS
- flex与滚动冲突
- snabbdom vdom 框架