(CLR via C#学习笔记)任务和并行操作

一 任务

可以调用ThreadPool的QueueUserWorkItem方法发起一次异步的计算限制操作.
但这个技术有很多限制.最大的问题是没有内建的机制让你知道操作在什么时候
完成和操作完成时的返回值.为了克服这些限制(并解决其他一些问题),Microsoft
引入了任务的概念.

1  //调用QueueUserWorkItem
2 ThreadPool.QueueUserWorkItem(DoSomeThing, 5);
3
4 //用任务来做相同的事情
5 Task.Run(() => DoSomeThing(5));      

二 任务抛出异常

如果计算限制的任务抛出未处理的异常,异常会被"吞噬"并存储到一个集合中,
而线程池线程可以返回到线程池中.调用Wait方法或者Result属性时,这些成员
会抛出一个System.AggregateException对象.

三  取消任务

调用CancellationToken的ThrowIfCancellationRequested,如果CancellationToken
已经取消,任务将会抛出OperationCanceledException.之所以选择抛出异常,是因为
和ThreadPool的QueueUserWorkItem方法初始化的工作项不同,任务有办法表示完成,
任务甚至能返回一个值.所以,采取一种方式将已完成的任务和出错的任务区分开.
而让任务抛出异常,就可以知道任务没有一直运行到结束.

 1 CancellationTokenSource cts = new CancellationTokenSource();
 2 Task<int> t = Task.Run<int>(() => Sum(cts.Token, 2000));
 3 Thread.Sleep(10);
 4 cts.Cancel();
 5
 6 try
 7 {
 8     Console.WriteLine("The Sum is: " + t.Result);
 9 }
10 catch (AggregateException x)
11 {
12     //将任何OperationCanceledException对象都视为已处理
13     //使其中只包含未处理的异常
14      x.Handle(e => e is OperationCanceledException);
15
16     //对未处理的异常进行处理
17     //TODO
18     //...
19     //...
20
21     Console.WriteLine("Sum was canceled");
22 }
 1 static int Sum(CancellationToken ct,int n)
 2 {
 3     if (n > 1000)
 4     {
 5         throw new Exception("Value of n is too large.");
 6     }
 7
 8     int sum = 0;
 9     for (int i = 1; i <= n; i++)
10     {
11         //如果CancellationTokenSource已取消(Cancel),
12         //下面代码将抛出"System.OperationCanceledException"异常
13         ct.ThrowIfCancellationRequested();
14         sum += i;
15     }
16     return sum;
17 }

四 Parallel的静态For,ForEach和Invoke方法

使用Parallel的方法一些前提条件:
a.工作项必须能并行执行,如果工作必须顺序执行,就不要使用Paralle方法;
b.工作项最好不要有修改共享数据的操作,否则多个线程同时处理共享数据,可能会算坏
数据;
c.每个工作项都涉及大量工作,那么使用Parallel方法产生的性能损失可以忽略不计;
d.有大量可由多个线程同时处理的工作项,那么使用Parallel也许能获得性能的提升.

 1 //Parallel的For方法
 2 for (int i = 0; i < 1000; i++)
 3 {
 4     DoWork(i);
 5 }
 6 Parallel.For(0, 1000, i => DoWork(i));
 7
 8 //Parallel的ForEach方法
 9 int[] idCollection = new int[] {1,2,3,4,5,6,7,8,9 };
10 foreach (var item in idCollection)
11 {
12     DoWork(item);
13 }
14 Parallel.ForEach(idCollection, item => DoWork(item));
15
16 //Parallel的Invoke方法
17 Method1();
18 Method2();
19 Method3();
20 Parallel.Invoke(
21     () => Method1(),
22     () => Method2(),
23     () => Method3());

五 定时计算限制操作(Timer)

FCL提供了几个以下几种主要的定时器:
a.System.Threading的Timer类
要在一个线程池上执行定时的(周期性发生的)后台任务,它是最好的计时器.

b.System.Timers的Timer类
这个计时器本质上是System.Threading的Timer类的包装类,它允许在Visual
Studio中的设计器更容易使用.
建议不用这个计时器,除非真的想在设计平面上添加一个计时器.

c.System.Windows.Forms的Timer类

时间: 2025-01-06 21:52:28

(CLR via C#学习笔记)任务和并行操作的相关文章

(CLR via C#学习笔记)异步操作 - 线程池

一 线程池基础 1.线程池维护了一个操作请求队列,将请求的操作追加到线程池队列中,线程池的代码从队列中提取操作项,派发给线程池中的线程; 2.CLR初始化时,线程池中是没有线程的,当有操作派发给线程池时,如果线程池中没有线程或者没有空闲状态的线程,将会创建一个新的线程执行派发的操作,如果有空闲状态的线程,将直接派发一个空闲状态的线程执行操作; 3.线程池线程完成操作任务后,线程不会被销毁,而是返回线程池,进入空闲状态,等待响应另一个派发请求;4.当一个线程池线程处于空闲状态一段时间后(不同的CL

CLR via C#学习笔记----知识总概括

第1章 CLR的执行模型 托管模块的各个组成部分:PE32或PE32+头,CLR头,元数据,IL(中间语言)代码. 高级语言通常只公开了CLR的所有功能的一个子集.然而,IL汇编语言允许开发人员访问CLR的所有功能. JITCompiler函数负责将一个方法的IL代码编译成本地CPU指令.由于IL是“即时”(just in time)编译的,所以通常将CLR的这个组件称为JITter或者JIT编译器. Microsoft定义了一个“公共语言规范”(Common Language Specific

CLR via C#学习笔记---类型

类的内存分配:http://www.cnblogs.com/JimmyZhang/archive/2008/01/31/1059383.html 关键字: abstract     (类)该类不能构建实例     (方法/属性/事件)表示构建派生类型的实例之前派生类型必须重写并实现这个成员 ) (常量/字段)不允许 virtual       (类)不允许                     (方法/属性/事件)表示这个成员可以由派生类重写 (常量/字段)不允许 override      

[读书笔记]C#学习笔记一: .Net Framwork

前言: 一次偶然的机会  在园子里看到@Learning hard 出版的一本书: <<C#学习笔记>>, 然后买来 一直到现在读完, 感觉很不错, 适合入门, 书中内容是从C#1.0 到5.0. 很全面也很细致. 下面就来分享一下这本书中自己感觉需要记录的一些东西. 这里先贴上@Learning hard本人在博客园的主页: http://www.cnblogs.com/zhili/     以及本书中的一些知识点: http://www.cnblogs.com/zhili/ca

C# 2012 step by step 学习笔记8 CHAPTER 9 Creating Value types with enumerations and Structures

C# 2012 step by step 学习笔记8 CHAPTER 9 Creating Value types with enumerations and Structures things about 1. Declare an enumeration type. 2. Create and use an enumeration type. 3. Declare a structure type. 4. Create and use a structure type. 5. Explain

【C#学习笔记】No.001 初识.NET Framework

关于贵客访问<C#学习笔记>的温馨提示: 本笔记用于个人学习C#技术的知识点.实例练习记录与心得记录 鄙人愿意和喜欢相关技术或者正打算学习C#的朋友进行交流学习 由于是个人是初次学习且该记录为学习笔记,所以难免会有错误或者不清晰的地方,这些地方会在后面的学习中不断改正和改善 对于已经出现的错误,也希望来到博客的人能指出并提示我或指导我,在此感谢大家了 对于决定共同学习的朋友(零基础),请看一下以下提示: 初学者不要过于钻牛角尖,鄙人的学习笔记都是从最基础的开始做的,有理论也有实例 每篇开头会有

义隆单片机学习笔记之(三) 应用例程

常用寄存器: 0x01 (R1) 计时器 0x02 (R2)程序计数器 PC 0x03 (R3)状态寄存器 0x04 (R4)间址寄存器 0x05 (R5)IO PORT 5 0x06 (R6)IO PORT 6 ----- (IOC5)P5的输入输出配置 ----- (IOC6)P6的输入输出配置 0x0f (ISR,读)中断信号指示寄存器(第三位有效,分别对应于3个中断源) 0x0f (IOCF,写)中断屏蔽标志 0x0E (IOCE)(IO60作为中断输入的配置与看门狗的开关在一个寄存器中

Cookie学习笔记(三)

11.4.3  删除会话变量 在使用会话时,需要创建一个方法来删除会话数据.在当前示例中,当用户注销时,这是必要的. 虽然cookie系统只需要发送另一个cookie来销毁现有的cookie,但是会话的要求更高,因为既要考虑客户上的cookie,又要考虑服务器上的数据. 要删除单独一个会话变量,可以使用unset()函数(它可以处理PHP中的任何变量): unset($_SESSION['var']); 要删除每个会话变量,可以重置整个$_SESSION数组: $_SESSION = array

WCF学习笔记(一)

WCF是什么? 官方解释: Windows Communication Foundation (WCF) 是用于构建面向服务的应用程序的框架.借助 WCF,可以将数据作为异步消息从一个服务终结点发送至另一个服务终结点. 服务终结点可以是由 IIS 承载的持续可用的服务的一部分,也可以是应用程序中承载的服务.终结点可以是从服务终结点请求数据的服务客户端.简单消息可以是作为 XML 发送的单个字符或单个单词,复杂消息可以是二进制数据流. 网络收集: Windows通信基础(Windows Commu