(CLR via C#学习笔记)任务和并行操作
一 任务
可以调用ThreadPool的QueueUserWorkItem方法发起一次异步的计算限制操作.
但这个技术有很多限制.最大的问题是没有内建的机制让你知道操作在什么时候
完成和操作完成时的返回值.为了克服这些限制(并解决其他一些问题),Microsoft
引入了任务的概念.
//调用QueueUserWorkItem
ThreadPool.QueueUserWorkItem(DoSomeThing, ); //用任务来做相同的事情
Task.Run(() => DoSomeThing());
二 任务抛出异常
如果计算限制的任务抛出未处理的异常,异常会被"吞噬"并存储到一个集合中,
而线程池线程可以返回到线程池中.调用Wait方法或者Result属性时,这些成员
会抛出一个System.AggregateException对象.
三 取消任务
调用CancellationToken的ThrowIfCancellationRequested,如果CancellationToken
已经取消,任务将会抛出OperationCanceledException.之所以选择抛出异常,是因为
和ThreadPool的QueueUserWorkItem方法初始化的工作项不同,任务有办法表示完成,
任务甚至能返回一个值.所以,采取一种方式将已完成的任务和出错的任务区分开.
而让任务抛出异常,就可以知道任务没有一直运行到结束.
CancellationTokenSource cts = new CancellationTokenSource();
Task<int> t = Task.Run<int>(() => Sum(cts.Token, ));
Thread.Sleep();
cts.Cancel(); try
{
Console.WriteLine("The Sum is: " + t.Result);
}
catch (AggregateException x)
{
//将任何OperationCanceledException对象都视为已处理
//使其中只包含未处理的异常
x.Handle(e => e is OperationCanceledException); //对未处理的异常进行处理
//TODO
//...
//... Console.WriteLine("Sum was canceled");
}
static int Sum(CancellationToken ct,int n)
{
if (n > )
{
throw new Exception("Value of n is too large.");
} int sum = ;
for (int i = ; i <= n; i++)
{
//如果CancellationTokenSource已取消(Cancel),
//下面代码将抛出"System.OperationCanceledException"异常
ct.ThrowIfCancellationRequested();
sum += i;
}
return sum;
}
四 Parallel的静态For,ForEach和Invoke方法
使用Parallel的方法一些前提条件:
a.工作项必须能并行执行,如果工作必须顺序执行,就不要使用Paralle方法;
b.工作项最好不要有修改共享数据的操作,否则多个线程同时处理共享数据,可能会算坏
数据;
c.每个工作项都涉及大量工作,那么使用Parallel方法产生的性能损失可以忽略不计;
d.有大量可由多个线程同时处理的工作项,那么使用Parallel也许能获得性能的提升.
//Parallel的For方法
for (int i = ; i < ; i++)
{
DoWork(i);
}
Parallel.For(, 1000, i => DoWork(i)); //Parallel的ForEach方法
int[] idCollection = new int[] {,,,,,,,, };
foreach (var item in idCollection)
{
DoWork(item);
}
Parallel.ForEach(idCollection, item => DoWork(item)); //Parallel的Invoke方法
Method1();
Method2();
Method3();
Parallel.Invoke(
() => Method1(),
() => Method2(),
() => Method3());
五 定时计算限制操作(Timer)
FCL提供了几个以下几种主要的定时器:
a.System.Threading的Timer类
要在一个线程池上执行定时的(周期性发生的)后台任务,它是最好的计时器.
b.System.Timers的Timer类
这个计时器本质上是System.Threading的Timer类的包装类,它允许在Visual
Studio中的设计器更容易使用.
建议不用这个计时器,除非真的想在设计平面上添加一个计时器.
c.System.Windows.Forms的Timer类
(CLR via C#学习笔记)任务和并行操作的更多相关文章
- .NET编程和SQL Server ——Sql Server 与CLR集成 (学习笔记整理-1)
原文:.NET编程和SQL Server ——Sql Server 与CLR集成 (学习笔记整理-1) 一.SQL Server 为什么要与CLR集成 1. SQL Server 提供的存储过程.函数 ...
- CLR via C#学习笔记----知识总概括
第1章 CLR的执行模型 托管模块的各个组成部分:PE32或PE32+头,CLR头,元数据,IL(中间语言)代码. 高级语言通常只公开了CLR的所有功能的一个子集.然而,IL汇编语言允许开发人员访问C ...
- CLR VIA C# 学习笔记
第19章 可空类型 1)使用Nullable<T>可将int32的值类型设置为Null,CLR会在Null时默认赋值为0; 如:Nullable<T> x=null; //使用 ...
- (CLR via C#学习笔记)异步操作 - 线程池
一 线程池基础 1.线程池维护了一个操作请求队列,将请求的操作追加到线程池队列中,线程池的代码从队列中提取操作项,派发给线程池中的线程; 2.CLR初始化时,线程池中是没有线程的,当有操作派发给线程池 ...
- (CLR via C#学习笔记)线程基础
一 使用线程的理由 1.可响应性(通常是对于客户端GUI应用程序);2.性能,多个CPU(或多核CPU)能并发执行多个线程,同时执行多个操作能提升性能. 二 线程开销 线程有空间(内存耗用)和时间(运 ...
- CLR via C#学习笔记---类型
类的内存分配:http://www.cnblogs.com/JimmyZhang/archive/2008/01/31/1059383.html 关键字: abstract (类)该类不能构建 ...
- 公共语言运行库(CLR)开发系列课程(1):Pinvoke 简介 学习笔记
前言 让拖管代码对象和非托管对象协同工作的过程称为互用性(Interoperability),通常简称为 Interop. P/Invoke在托管代码与非托管代码交互式时产生一个事务(Transiti ...
- [C#] 类型学习笔记一:CLR中的类型,装箱和拆箱
在学习.NET的时候,因为一些疑问,让我打算把.NET的类型篇做一个总结.总结以三篇博文的形式呈现. 这篇博文,作为三篇博文的第一篇,主要探讨了.NET Framework中的基本类型,以及这些类型一 ...
- linq学习笔记
最近在学习linq的一些基础知识,看了c#高级编程及阅读了园子内部几篇优秀的博文,有所体会,感觉应该记录下来,作为以后复习使用.都是一些最基础的知识,大致分为三个部分:linq预备知识:linq查询: ...
随机推荐
- [MongoDB]安装MongoDB遇到问题
1. 首先,当然是下载 MongoDB MongoDB的官方网站是:http://www.mongodb.org/, 最新版本下载在:http://www.mongodb.org/downloads ...
- IDEA Tomcat部署时war和war exploded区别以及平时踩得坑
war和war exploded的区别 在使用IDEA开发项目的时候,部署Tomcat的时候通常会出现下边的情况: 是选择war还是war exploded 这里首先看一下他们两个的区别: war模式 ...
- Thrift Expected protocol id ffffff82 but got 0
如果服务端配的也是noblock=false;客户端不能改成noblock=true;
- localstorage - HTML 5 Web 存储总结---【巷子】
001.localStorage概念 在html5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储,解决了cookie存储空间不足的问题(cookie中每条cookie存储 ...
- Log4Net的简单使用
在前面的随笔中,已经异常处理过滤器中,我们已经将获取到的错误信息写到队列中去,然后又单独的线程对队列中的错误信息处理,将错误信息输出到制定的文件中,但是如果我们需要改变需求,打算将错误信息输出到数据库 ...
- JS生成GUID方法
function GUID() { this.date = new Date(); /* 判断是否初始化过,如果初始化过以下代码,则以下代码将不再执行,实际中只执行一次 */ if (typeof t ...
- Oracle数据库误删文件导致rman备份报错RMAN-06169解决办法
Oracle数据库误删文件导致rman备份报错RMAN-06169解决办法 可能是误删文件导致在使用rman备份时候出现以下提示 RMAN-06169: could not read file hea ...
- Asp.NET 与 WebApi 共享Session
首先新建一个.net framework 4.5.2的 web应用程序,选择WebApi基架,包括MVC与Webapi 1.在global.asax中启用Session 2.在HomeControll ...
- Expedition---poj2431(优先队列-堆的实现)
题目链接:http://poj.org/problem?id=2431 题意:一辆卡车需要行驶 L 距离,车上油的含量为 P,在行驶的过程中有 n 个加油站 每个加油站到终点的距离是ai,每个加油站最 ...
- mysql 取当前日期对应的周一或周日
select subdate(curdate(),date_format(curdate(),'%w')-1)//获取当前日期在本周的周一 select subdate(curdate(),date_ ...