.net 线程基础 ThreadPool 线程池
1. ThreadPool 线程池异步:
//public static bool QueueUserWorkItem(WaitCallback callBack);
//public static bool QueueUserWorkItem(WaitCallback callBack, object state);
QueueUserWorkItem 中的WaitCallback 参数是 一个 委托对象。
static void Main(string[] args) {
//线程
AsynchTempte.ThreadQueueMethod();
} /// <summary>
/// 执行简单的计算限制操作 线程队列
/// </summary>
public static void ThreadQueueMethod()
{
//要将一个异步的计算限制操作放到线程池队列中,通常可以调用ThreadPool类定义 //线程池以异步执行方法
Console.WriteLine("Main thread:queuing an asynchronous operation");
ThreadPool.QueueUserWorkItem((state) => {
//执行委托代码
Thread.Sleep();
Console.WriteLine("In ComputeBoundOp:State={0}", state);
}, ); Console.WriteLine("Hit Liuyl");
}
2. 执行上下文: CallContext
当一个线程使用另一个线程时候,前者执行的上下文会流向后者。
执行如下代码 会发现Name 就没有内容输出 ExecutionContext.SuppressFlow()
/// <summary>
/// 执行上下文
/// </summary>
public static void ThreadQueueMethod2()
{
//将一些数据放到当前线程的逻辑上下文中
CallContext.LogicalSetData("Name", "Liuyl"); // 初始化要由一个线程池做的一些工作
//线程池才能访问逻辑调用上下文数据
ThreadPool.QueueUserWorkItem((state) =>
{
Console.WriteLine("Name={0}", CallContext.LogicalGetData("Name"));
}); //阻止上下文流动
ExecutionContext.SuppressFlow(); // 初始化要由一个线程池做的一些工作
//线程池才能访问逻辑调用上下文数据
ThreadPool.QueueUserWorkItem((state) =>
{
Console.WriteLine("Name2={0}", CallContext.LogicalGetData("Name"));
}); //恢复线程的执行上下文的流动
ExecutionContext.RestoreFlow(); Console.WriteLine("liuylstart");
}
3. 协作取消和超时:
.net 提供了标准的取消操作模式 - 协作式 CancellationTokenSource
如下 代码 ,调用cts.Cancel 后 遍历就停止
/// <summary>
/// 协作取消和超时
/// </summary>
public static void ThreadQueueMethod3()
{
CancellationTokenSource cts = new CancellationTokenSource();
//将CancellationToken 和“要数到的票数” 传入函数count
ThreadPool.QueueUserWorkItem(o => Count(cts.Token, ));
Console.WriteLine("Press <enter> to cancel the operation.");
Console.ReadLine();
//停止
cts.Cancel(); Console.ReadLine();
} private static void Count(CancellationToken token, int countTo)
{
for (int count = ; count < countTo; count++)
{
if (token.IsCancellationRequested)
{
Console.WriteLine("Count is cancellen");
break;
}
Console.WriteLine("count:{0}", count);
Thread.Sleep();
}
Console.WriteLine("Count is done"); }
CancellationTokenSource 的 Token.Register 回调委托:
//当执行 cts.Cancel(); 会输出如下文本
cts.Token.Register(() => Console.WriteLine("Canceled 1"));
cts.Token.Register(() => Console.WriteLine("Canceled 2"));
.net 线程基础 ThreadPool 线程池的更多相关文章
- Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量
Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量 一丶线程的理论知识 什么是线程: 1.线程是一堆指令,是操作系统调度 ...
- java线程基础巩固---线程生命周期以及start方法源码剖析
上篇中介绍了如何启动一个线程,通过调用start()方法才能创建并使用新线程,并且这个start()是非阻塞的,调用之后立马就返回的,实际上它是线程生命周期环节中的一种,所以这里阐述一下线程的一个完整 ...
- 014-多线程-基础-Exchanger-行线程间的数据交换
一.简介 Exchanger类允许在两个线程之间定义同步点,当两个线程都到达同步点时,它们交换数据.也就是第一个线程的数据进入到第二个线程中,第二线程的数据进入到第一个线程中. Exchanger可以 ...
- java线程基础巩固---线程生产者消费者的综合实战结合Java8语法
基于上一次[http://www.cnblogs.com/webor2006/p/8909558.html]学习的多个生产者与多个消费者模型,此次用另外一个案例来进一步巩固线程之间的调度处理,这里还是 ...
- java线程基础知识----线程与锁
我们上一章已经谈到java线程的基础知识,我们学习了Thread的基础知识,今天我们开始学习java线程和锁. 1. 首先我们应该了解一下Object类的一些性质以其方法,首先我们知道Object类的 ...
- java线程基础知识----线程基础知识
不知道从什么时候开始,学习知识变成了一个短期记忆的过程,总是容易忘记自己当初学懂的知识(fuck!),不知道是自己没有经常使用还是当初理解的不够深入.今天准备再对java的线程进行一下系统的学习,希望 ...
- java线程基础巩固---线程间通信快速入门,使用wait和notify进行线程间的数据通信
之前已经对于线程同步相关的知识点进行了详细的学习,这次来学习一下线程间的通信相关的知识,话不多说直接用代码进行演练,以一个简陋的生产者消费者模型来初步了解下线程间通信是怎么一回事. 生产消费者第一版: ...
- java线程基础巩固---线程ID,优先级
这里学习Thread的两个比较简单的API,直接上代码: 线程ID: 那它的生成规则是?直接看源码: 那为什么目前打印是9呢?然后在jvm启动的时候就已经创建了8个线程?继续用jconsole来验证一 ...
- C#多线程编程系列(二)- 线程基础
目录 C#多线程编程系列(二)- 线程基础 1.1 简介 1.2 创建线程 1.3 暂停线程 1.4 线程等待 1.5 终止线程 1.6 检测线程状态 1.7 线程优先级 1.8 前台线程和后台线程 ...
随机推荐
- ASU一位图形学老师推荐的book list
http://peterwonka.net/Documentation/BooksToRead.htm 包括数学.图形学.OpenGL等资料
- 关于微软的.NET版本系列
.net的不同版本的区分,感觉十分坑,搞开发的不能还去研究他们的版本含义或差异吧!下面为整理的一些相关内容: 一..NET的那些版本 .net framework 版本是可以向后兼容的,安装高版本的可 ...
- [转] 基于C#的波形显示控件的实现
转自 基于C#的波形显示控件的实现[附完整源码下载] 编者记: 09年暑假正好在学院实验室呆了一段时间,做了个完整的上位机软件(具体实现:根据下位机的指令,实现通过串口来操纵下位机进行实验,并将采集的 ...
- “C# 未在本地计算机上注册microsoft.Jet.OLEDB.12.0”的解决方案
在进行Access数据库进行操作时,连接字符串为: OleDbConnection cn = new OleDbConnection("Provider=Microsoft.Jet.OLED ...
- halcon-车牌识别
halcon代码: 1: read_image(Image,'D:/MyFile/halcon/车牌识别/图片.jpg') 2: decompose3(Image,ImageR,ImageG,Imag ...
- Java 循环遍历删除set list中的元素
删除List和Set中的某些元素 错误代码的写法: Set<String> set = new HashSet<String>(); set.add("aaaaaa& ...
- [iOS]swift版内购
//内购Demo,看代码说话吧 class IAPTestViewController: UIViewController ,SKProductsRequestDelegate, SKPaymentT ...
- 通过ajax异步调用返回值
调用方法的时候传递一个callback方法来获取成功回调的值test(function (data) { }); function test(callback){ $.ajax({ type: &qu ...
- SPI子系统分析之四:驱动模块
内核版本:3.9.5 SPI控制器层(平台相关) 上一节讲了SPI核心层的注册和匹配函数,它是平台无关的.正是在核心层抽象了SPI控制器层的相同部分然后提供了统一的API给SPI设备层来使用.我们这一 ...
- spring jpa 创建时间和更新时间自动更新
@Entity @Table(name="RS_SIGNUPUSER") public class RsSignUpUser { @Id @GenericGenerator(nam ...