一、Task和多线程以及异常的捕获示例代码:

static void Main(string[] args)
{
// 产生CancellationToken的类,该类允许使用Cancel方法终止线程
// 也可以使用CancellationTokenSource.CreateLinkedTokenSource创建
// 一组相关的Token,任意一个取消都取消
CancellationTokenSource ts = new CancellationTokenSource(); CancellationToken ct = ts.Token; Task t = null; t = new Task(() =>
{
for (int i = ; i < ; i++)
{
// 调用Cancel方法,状态为true(表示已经取消了)
if (!ts.IsCancellationRequested)
{
if (i == )
{
// 该异常不会直接被主线程捕获
throw new Exception("数字是5,非法!");
}
}
else
{
Console.WriteLine("用户取消");
// 抛出异常,强制取消子线程
ct.ThrowIfCancellationRequested();
}
Console.WriteLine(i);
Thread.Sleep();
}
}, ct);
t.Start(); // 注册Cancel之后的引发的事件,注意Exception也可以在这里捕获
t.ContinueWith((task) =>
{
// 只有调用Cancel方法才会被设置为True
Console.WriteLine(t.IsCanceled);
// 无论何种情况,只要完成了就是True
Console.WriteLine(t.IsCompleted);
// 只要有异常,为True(哪怕是ThrowIfCancellationRequested异常)
Console.WriteLine(t.IsFaulted);
// 捕获各种各样的异常
foreach (var item in task.Exception.InnerExceptions)
{
Console.WriteLine(item.Message);
}
});
Console.ReadLine();
// 取消任务
ts.Cancel();
Thread.Sleep(Timeout.Infinite);
}

结论:

1、无论任何异常都会终止子线程。

2、异常发生之后,只有在Task的Wait/WaitAll/WaitAny/Result或者Continue方法才可以捕获异常,主线程不可能,因为是子线程中的异常。

二、Task的任务先后顺序(允许嵌套任务),同时允许把线程挂接到主线程上执行返回结果(避免以前Thread和WinForm控件交互时候发生的“不是由本线程创建的控件异常……”问题):

static void Main(string[] args)
{
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken ct = cts.Token; Task t = new Task(() =>
{
Console.WriteLine("主任务开始……,包含3个子任务:");
Task.Factory.StartNew(() =>
{
Thread.Sleep();
Console.WriteLine("任务一");
},
// 挂接到主线程,这样主线程会自动等待子线程完成后完成
TaskCreationOptions.AttachedToParent ); Task.Factory.StartNew(() =>
{
Thread.Sleep();
Console.WriteLine("任务二");
}, TaskCreationOptions.AttachedToParent); Task.Factory.StartNew(() =>
{
Thread.Sleep();
Console.WriteLine("任务三");
},
TaskCreationOptions.AttachedToParent);
}, ct); t.ContinueWith((Task) =>
{
Console.WriteLine("子任务都完成,主任务结束。");
// 指定上下文的同步块,防止跨线程访问控件的问题(控制台程序不能使用,WinForm啥可以)
},TaskScheduler.FromCurrentSynchronizationContext());
t.Start(); Thread.Sleep(Timeout.Infinite);
}

相比较原来的Wait而言,不会卡死子线程,而且又可以多任务运行。

欲想知道更多关于线程操作的东西,可以参考:

MSDN,并行处理系列篇:http://msdn.microsoft.com/zh-cn/library/vstudio/3e8s7xdd(v=vs.110).aspx

最新文章

  1. MySQL 插入数据时,中文乱码问题的解决(转)
  2. hihoCoder#1384 : Genius ACM
  3. Js中各类型数据到bool的转换
  4. MySQL主从同步几个文件
  5. Aptana 插件 for Eclipse 4.4
  6. CentOS6.5下安装MariaDB5.5.36
  7. SaundProgressBar
  8. Nginx详细配置
  9. linux Page cache和buffer cache----- systemtap
  10. Xamarin 开发常见问题
  11. [ZETCODE]wxWidgets教程二:辅助类
  12. 14 - XML、JSON、PLIST对比和APP生命周期
  13. 使用sed修改配置项的值
  14. WPF---Xaml中改变ViewModel的值
  15. windows平台下 c/c++进行http通信的教训
  16. 在其他Activity中展示自定义相机拍的照片
  17. noip单词接龙
  18. jquery为表格行添加上下移动画效果
  19. 【转】Python 字典中的中文输出问题
  20. 20155322 《Java程序设计》课堂实践项目MyOD

热门文章

  1. 微信Token验证
  2. C# LINQ(4)
  3. C# 继承(3)
  4. CH收藏的书
  5. SiriShortCut模型建立及数据交互逻辑
  6. linux 常用端口【转载】
  7. java学习笔记之位运算符
  8. 【python】10分钟教你用python下载和拼接微信好友头像图片
  9. Httprequest 添加Cookie
  10. COCO2018 stuff分割