一 任务

可以调用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#学习笔记)任务和并行操作的更多相关文章

  1. .NET编程和SQL Server ——Sql Server 与CLR集成 (学习笔记整理-1)

    原文:.NET编程和SQL Server ——Sql Server 与CLR集成 (学习笔记整理-1) 一.SQL Server 为什么要与CLR集成 1. SQL Server 提供的存储过程.函数 ...

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

    第1章 CLR的执行模型 托管模块的各个组成部分:PE32或PE32+头,CLR头,元数据,IL(中间语言)代码. 高级语言通常只公开了CLR的所有功能的一个子集.然而,IL汇编语言允许开发人员访问C ...

  3. CLR VIA C# 学习笔记

    第19章 可空类型 1)使用Nullable<T>可将int32的值类型设置为Null,CLR会在Null时默认赋值为0; 如:Nullable<T> x=null; //使用 ...

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

    一 线程池基础 1.线程池维护了一个操作请求队列,将请求的操作追加到线程池队列中,线程池的代码从队列中提取操作项,派发给线程池中的线程; 2.CLR初始化时,线程池中是没有线程的,当有操作派发给线程池 ...

  5. (CLR via C#学习笔记)线程基础

    一 使用线程的理由 1.可响应性(通常是对于客户端GUI应用程序);2.性能,多个CPU(或多核CPU)能并发执行多个线程,同时执行多个操作能提升性能. 二 线程开销 线程有空间(内存耗用)和时间(运 ...

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

    类的内存分配:http://www.cnblogs.com/JimmyZhang/archive/2008/01/31/1059383.html 关键字: abstract     (类)该类不能构建 ...

  7. 公共语言运行库(CLR)开发系列课程(1):Pinvoke 简介 学习笔记

    前言 让拖管代码对象和非托管对象协同工作的过程称为互用性(Interoperability),通常简称为 Interop. P/Invoke在托管代码与非托管代码交互式时产生一个事务(Transiti ...

  8. [C#] 类型学习笔记一:CLR中的类型,装箱和拆箱

    在学习.NET的时候,因为一些疑问,让我打算把.NET的类型篇做一个总结.总结以三篇博文的形式呈现. 这篇博文,作为三篇博文的第一篇,主要探讨了.NET Framework中的基本类型,以及这些类型一 ...

  9. linq学习笔记

    最近在学习linq的一些基础知识,看了c#高级编程及阅读了园子内部几篇优秀的博文,有所体会,感觉应该记录下来,作为以后复习使用.都是一些最基础的知识,大致分为三个部分:linq预备知识:linq查询: ...

随机推荐

  1. 【BZOJ3551】[ONTAK2010]Peaks加强版 最小生成树+DFS序+主席树

    [BZOJ3545][ONTAK2010]Peaks Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困 ...

  2. 证书:数字签名和验签&加密和解密

    用的是湖北省数字证书认证管理中心的签名和加密 1.带私钥的证书,即p12格式证书(后缀为.pfx) 2.不带私钥的证书,有多种格式,通常我们使用的是cer格式证书(后缀为.cer) 一. 1.什么是对 ...

  3. 【模块化开发】------requireJS的基本使用------【巷子】

    前言 为了提高代码的复用度,开发人员会按照功能把大量的js代码分成若干文件,这样在多个页面就可以使用同一个文件了.,下面是某个网站的js引用情况 虽然代码的复用度提升了,但是缺点也体现了出来 缺点: ...

  4. 您好,python的请求es的http库是urllib3, 一个请求到贵司的es节点,想了解下,中间有哪些网关啊?冒昧推测,贵司的部分公共网关与python-urllib3的对接存在异常?

    您好,python的请求es的http库是urllib3, 一个请求到贵司的es节点,想了解下,中间有哪些网关啊?冒昧推测,贵司的部分公共网关与python-urllib3的对接存在异常? 负载均衡( ...

  5. Python爬虫scrapy-redis分布式实例(一)

    目标任务:将之前新浪网的Scrapy爬虫项目,修改为基于RedisSpider类的scrapy-redis分布式爬虫项目,将数据存入redis数据库. 一.item文件,和之前项目一样不需要改变 # ...

  6. Django - Cookie、Session、自定义分页和Django分页器

    2. 今日内容 https://www.cnblogs.com/liwenzhou/p/8343243.html 1. Cookie和Session 1. Cookie 服务端: 1. 生成字符串 2 ...

  7. python调用API

    相信做过自动化运维的同学都用过API接口来完成某些动作.API是一套成熟系统所必需的接口,可以被其他系统或脚本来调用,这也是自动化运维的必修课. 本文主要介绍Python中调用API的几种方式,下面是 ...

  8. python 使用qqwry.dat获取ip物理地址:速度快

    # -*- coding: utf-8 -*- import socket import struct class IPAddresss: def __init__(self, ipdbFile): ...

  9. 每日算法之三十五:Wildcard Matching

    模式匹配的实现,'?'代表单一字符,'*'代表随意多的字符.写代码实现两个字符串是否匹配. Implement wildcard pattern matching with support for ' ...

  10. SDWebimage清空缓存

    清空缓存 - (void)clearTmpPics{ [[SDImageCache sharedImageCache] clearDisk]; [[SDImageCache sharedImageCa ...