Task的一些用法总结
一、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的一些用法总结的更多相关文章
- async,await,Task 的一些用法
async,await,Task 的一些用法 private void Form1_Load(object sender, EventArgs e) { Display(); } public asy ...
- c#4.0 Task.Factory.StartNew 用法
var t1 = Task.Factory.StartNew<string>(() => { return “1111111”; }); //t1.Wait(); t1.Contin ...
- C# Task.FromResult的用法
Task.FromResult用来创建一个带返回值的.已完成的Task. 场景一:以同步的方式实现一个异步接口方法比如有一个接口包含异步方法. interface IMyInterface { Tas ...
- Task WaitAll的用法
var tasklst = new List<Task>(); ; i < urls.Count; i++) { tasklst.Add(Task.Factory.StartNew& ...
- SSIS Execute SQL Task 用法
Execute Sql Task组件是一个非常有用的Control Flow Task,可以直接执行SQL语句,例如,可以执行数据更新命令(update,delete,insert),也可以执行sel ...
- C# Task 用法
C# Task 的用法 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来进行操作.可以跟线程一样可以轻松的对执行的方法进行控制. 顺便提一下, ...
- C# Task 的用法
C# Task 的用法(转自:http://www.wxzzz.com/683.html#) 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来 ...
- C#基础系列——多线程的常见用法详解
前言:前面几节分别介绍了下C#基础技术中的反射.特性.泛型.序列化.扩展方法.Linq to Xml等,这篇跟着来介绍下C#的另一基础技术的使用.最近项目有点紧张,所以准备也不是特别充分.此篇就主要从 ...
- 细说.NET中的多线程 (三 使用Task)
上一节我们介绍了线程池相关的概念以及用法.我们可以发现ThreadPool. QueueUserWorkItem是一种起了线程之后就不管了的做法.但是实际应用过程,我们往往会有更多的需求,比如如果更简 ...
随机推荐
- 桥梁(Bridge)模式
桥梁(Bridge)模式:桥梁模式是一个非常有用的模式,也是比较复杂的一个模式.熟悉这个模式对于理解面向对象的设计原则,包括"开-闭"原则(OCP)以及组合/聚合复用原则(CARP ...
- Sharepoint2013搜索学习笔记之搜索构架简单概述(一)
Sharepoint搜索引擎主要由6种组件构成,他们分别是爬网组件,内容处理组件,分析处理组件,索引组件,查询处理组件,搜索管理组件.可以将这6种组件分别部署到Sharepoint场内的多个服务器上, ...
- jenkins slave Windows 2008 R2
布置jenkins,添加节点(win2008R2) 配置节点参考: http://www.cnblogs.com/juddhu/archive/2013/07/18/3198191.html 生效la ...
- C#设计模式系列:适配器模式(Adapter Pattern)
一.引言 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用.但是新环境要求的接口是这些现存对象所不满足的.如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同 ...
- SiriShortCut模型建立及数据交互逻辑
1.模型数据需求 意图: 手机号 密码 网关ID 打开该情景的命令 情景号 情景名 情景背景图 添加该意图时的 token值 主程序登陆共享数据 手机号 token值 2.操作逻辑 1.意图被唤起 获 ...
- opencv.js小案例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- [USACO08DEC]拍头Patting Heads 数学 BZOJ 1607
题目描述 It's Bessie's birthday and time for party games! Bessie has instructed the N (1 <= N <= 1 ...
- [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用户启动的. 解决的办法:当然是创建一个用户,用创建的用户启动啦,注意权限的问题,目录也应该改为创建的用户权限! 我是用 ...
- php 对象的自定义遍历
php对象的自定义遍历 对手册中的案例进行分析 更好的理解foreach() 的遍历步骤 class myIterator implements Iterator { private $positio ...
- centos下dnsmasq安装与配置
说明1.dnsmasq是一款小巧且方便地用于配置DNS服务器和DHCP服务器的工具,适用于小型网络,它提供了DNS解析功能和可选择的DHCP功能. 2.dnsmasq可以解决小范围的dns查询问题,如 ...