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

一 线程池基础

1.线程池维护了一个操作请求队列,将请求的操作追加到线程池队列中,线程池的代码从队列中提取
操作项,派发给线程池中的线程;

2.CLR初始化时,线程池中是没有线程的,当有操作派发给线程池时,如果线程池中没有线程或者没有
空闲状态的线程,将会创建一个新的线程执行派发的操作,如果有空闲状态的线程,将直接派发一个
空闲状态的线程执行操作;

3.线程池线程完成操作任务后,线程不会被销毁,而是返回线程池,进入空闲状态,等待响应另一个派发请求;
4.当一个线程池线程处于空闲状态一段时间后(不同的CLR对这个时间定义不同),线程会自己醒来终止自己以释放内存资源.

示例代码:

 1 Console.WriteLine("主线程...");
 2 ThreadPool.QueueUserWorkItem(DoSomething, 5);
 3 Console.WriteLine("主线程继续执行...");
 4
 5 static void DoSomething(object state)
 6         {
 7             Thread.Sleep(2000);
 8             int num = (int)state;
 9             Console.WriteLine("DoSomething..., Number:" + num);
10             return;
11         }

输出结果:

主线程...

主线程继续执行...

DoSomething..., Number:5

二 执行上下文

System.Threading命名空间有一个ExecutionContext类,它允许你控制线程的执行上下文如何

从一个线程"流"向另一个,默认情况下,CLR自动造成初始线程的志向上下文"流向"任何辅助线程.

示例代码:

 1 CallContext.LogicalSetData("Name", "Mike");
 2 //线程池线程可以访问逻辑调用上下文数据
 3 ThreadPool.QueueUserWorkItem(state => Console.WriteLine("Name:{0}", CallContext.LogicalGetData("Name")));
 4
 5 //取消执行上下文在异步线程间的流动
 6 ExecutionContext.SuppressFlow();
 7 //线程池线程将不能访问逻辑调用上下文数据
 8 ThreadPool.QueueUserWorkItem(state => Console.WriteLine("Name:{0}", CallContext.LogicalGetData("Name")));
 9
10 //恢复执行上下文在异步线程间的流动
11 ExecutionContext.RestoreFlow();
12 //...

执行结果:

Name:Mike

Name:

三 协作式取消

 1 //注册取消CancelationToken时调用的委托
 2 var cts = new CancellationTokenSource();
 3 cts.Token.Register(() => Console.WriteLine("The operation will be cancelled. -- 1"));
 4 cts.Token.Register(() => Console.WriteLine("The operation will be cancelled. -- 2"));
 5
 6 //线程开始执行操作
 7 ThreadPool.QueueUserWorkItem(a => Count(cts.Token, 1000));
 8
 9 Console.WriteLine("Please <Enter> to cancel the operation.");
10 Console.ReadLine();
11
12 //传达取消请求
13 cts.Cancel();
14
15
16 //执行计数操作
17 static void Count(CancellationToken token, int countTo)
18 {
19     for (int i = 0; i < countTo; i++)
20     {
21         if (token.IsCancellationRequested)  //是否已请求取消
22         {
23             break;
24         }
25         Thread.Sleep(500);
26         Console.WriteLine(i);
27     }
28 }

说明: 键入"Enter"键,传达取消标识,Count计数操作结束,注册的两个委托方法得到执行.

时间: 2024-10-26 01:07:55

(CLR via C#学习笔记)异步操作 - 线程池的相关文章

java笔记--使用线程池优化多线程编程

使用线程池优化多线程编程 认识线程池 在Java中,所有的对象都是需要通过new操作符来创建的,如果创建大量短生命周期的对象,将会使得整个程序的性能非常的低下.这种时候就需要用到了池的技术,比如数据库连接池,线程池等. 在java1.5之后,java自带了线程池,在util包下新增了concurrent包,这个包主要作用就是介绍java线程和线程池如何使用的. 在包java.util.concurrent下的 Executors类中定义了Executor.ExecutorService.Sche

Linux System Programming 学习笔记(七) 线程

1. Threading is the creation and management of multiple units of execution within a single process 二进制文件是驻留在存储介质上,已被编译成操作系统可以使用,准备执行但没有正运行的休眠程序 进程是操作系统对 正在执行中的二进制文件的抽象:已加载的二进制.虚拟内存.内核资源 线程是进程内的执行单元 processes are running binaries, threads are the smal

python笔记——简易线程池multiprocessing.Pool

多线程模型设计是一个比较复杂的逻辑,但是python对于多线程的处理却有种种方便的类库,不需要过多的纠结线程间的操作细节.比如multiprocessing.Pool就是其中之一. 官方给的范例也很简单. from multiprocessing import Pool def f(x): return x*x if __name__ == '__main__': pool = Pool(processes=4) # start 4 worker processes result = pool.

操作系统学习笔记----进程/线程模型----Coursera课程笔记

操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进程创建.撤销.阻塞.唤醒.... 0.2 线程模型 为什么引入线程 线程的组成 线程机制的实现 用户级线程.核心级线程.混合方式 1. 进程的基本概念 1.1 多道程序设计 允许多个程序同时进入内存运行,目的是为了提高CPU系统效率 1.2 并发环境与并发程序 并发环境: 一段时间间隔内,单处理器上

java学习笔记14--多线程编程基础1

本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为一个进程,例如:用字处理软件编辑文稿时,同时打开mp3播放程序听音乐,这两个独立的程序在同时运行,称为两个进程 进程要占用相当一部分处理器时间和内存资源 进程具有独立的内存空间 通信很不方便,编程模型比较复杂 多线程 一个程序中多段代码同时并发执行,称为多线程,线程比进程开销小,协作和数据交换容易

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

Dubbo -- 系统学习 笔记 -- 示例 -- 线程模型

Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 线程模型 事件处理线程说明 如果事件处理的逻辑能迅速完成,并且不会发起新的IO请求,比如只是在内存中记个标识,则直接在IO线程上处理更快,因为减少了线程池调度. 但如果事件处理逻辑较慢,或者需要发起新的IO请求,比如需要查询数据库,则必须派发到线程池,否则IO线程阻塞,将导致不能接收其它请求. 如果用IO线程处理事件,又在事件处理过程中发起新的IO请求,比如在连接事件中发起登录请

JavaSE中线程与并行API框架学习笔记1——线程是什么?

前言:虽然工作了三年,但是几乎没有使用到多线程之类的内容.这其实是工作与学习的矛盾.我们在公司上班,很多时候都只是在处理业务代码,很少接触底层技术. 可是你不可能一辈子都写业务代码,而且跳槽之后新单位很可能有更高的技术要求.除了干巴巴地翻书,我们可以通过两个方式来解决这个问题:一是做业余项目,例如在github上传自己的demo,可以实际使用:二是把自己的学习心得写成博客,跟同行们互相交流. 3.1 线程的初窥门径 我们在之前的文章里提到的程序其实都是单线程程序,也就说启动的程序从main()程

C#学习笔记之线程 - 通知Signal

通知事件等待句柄 Signal With EventWaitHandle 事件等待句柄常用于通知.当一个线程等待直到接收到另外一个线程发出的信号.事件等待句柄是最简单的信号结构,它与C#事件无关.有三种方式:AutoResetEvent,ManualResetEven及CountdownEvent.前2者是基于通用的EventWaitHandle类,它们派生了所有功能. AutoResetEvent AutoResetEvent非常像一个验票闸门:插入一张票让一个人通过.名字中的自动意思是当人通