一、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

Task的一些用法总结的更多相关文章

  1. async,await,Task 的一些用法

    async,await,Task 的一些用法 private void Form1_Load(object sender, EventArgs e) { Display(); } public asy ...

  2. c#4.0 Task.Factory.StartNew 用法

    var t1 = Task.Factory.StartNew<string>(() => { return “1111111”; }); //t1.Wait(); t1.Contin ...

  3. C# Task.FromResult的用法

    Task.FromResult用来创建一个带返回值的.已完成的Task. 场景一:以同步的方式实现一个异步接口方法比如有一个接口包含异步方法. interface IMyInterface { Tas ...

  4. Task WaitAll的用法

    var tasklst = new List<Task>(); ; i < urls.Count; i++) { tasklst.Add(Task.Factory.StartNew& ...

  5. SSIS Execute SQL Task 用法

    Execute Sql Task组件是一个非常有用的Control Flow Task,可以直接执行SQL语句,例如,可以执行数据更新命令(update,delete,insert),也可以执行sel ...

  6. C# Task 用法

    C# Task 的用法 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来进行操作.可以跟线程一样可以轻松的对执行的方法进行控制. 顺便提一下, ...

  7. C# Task 的用法

    C# Task 的用法(转自:http://www.wxzzz.com/683.html#) 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来 ...

  8. C#基础系列——多线程的常见用法详解

    前言:前面几节分别介绍了下C#基础技术中的反射.特性.泛型.序列化.扩展方法.Linq to Xml等,这篇跟着来介绍下C#的另一基础技术的使用.最近项目有点紧张,所以准备也不是特别充分.此篇就主要从 ...

  9. 细说.NET中的多线程 (三 使用Task)

    上一节我们介绍了线程池相关的概念以及用法.我们可以发现ThreadPool. QueueUserWorkItem是一种起了线程之后就不管了的做法.但是实际应用过程,我们往往会有更多的需求,比如如果更简 ...

随机推荐

  1. 桥梁(Bridge)模式

    桥梁(Bridge)模式:桥梁模式是一个非常有用的模式,也是比较复杂的一个模式.熟悉这个模式对于理解面向对象的设计原则,包括"开-闭"原则(OCP)以及组合/聚合复用原则(CARP ...

  2. Sharepoint2013搜索学习笔记之搜索构架简单概述(一)

    Sharepoint搜索引擎主要由6种组件构成,他们分别是爬网组件,内容处理组件,分析处理组件,索引组件,查询处理组件,搜索管理组件.可以将这6种组件分别部署到Sharepoint场内的多个服务器上, ...

  3. jenkins slave Windows 2008 R2

    布置jenkins,添加节点(win2008R2) 配置节点参考: http://www.cnblogs.com/juddhu/archive/2013/07/18/3198191.html 生效la ...

  4. C#设计模式系列:适配器模式(Adapter Pattern)

    一.引言 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用.但是新环境要求的接口是这些现存对象所不满足的.如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同 ...

  5. SiriShortCut模型建立及数据交互逻辑

    1.模型数据需求 意图: 手机号 密码 网关ID 打开该情景的命令 情景号 情景名 情景背景图 添加该意图时的 token值 主程序登陆共享数据 手机号 token值 2.操作逻辑 1.意图被唤起 获 ...

  6. opencv.js小案例

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. [USACO08DEC]拍头Patting Heads 数学 BZOJ 1607

    题目描述 It's Bessie's birthday and time for party games! Bessie has instructed the N (1 <= N <= 1 ...

  8. [o.e.b.ElasticsearchUncaughtExceptionHandler] [unknown] uncaught exception in thread [main] org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root

    这是因为不知从哪个版本后,elasticsearch为了安全性,是不能用root用户启动的. 解决的办法:当然是创建一个用户,用创建的用户启动啦,注意权限的问题,目录也应该改为创建的用户权限! 我是用 ...

  9. php 对象的自定义遍历

    php对象的自定义遍历 对手册中的案例进行分析 更好的理解foreach() 的遍历步骤 class myIterator implements Iterator { private $positio ...

  10. centos下dnsmasq安装与配置

    说明1.dnsmasq是一款小巧且方便地用于配置DNS服务器和DHCP服务器的工具,适用于小型网络,它提供了DNS解析功能和可选择的DHCP功能. 2.dnsmasq可以解决小范围的dns查询问题,如 ...