.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 前台线程和后台线程 ...
随机推荐
- centos 6.3 kickstart 装机卡在 unsupported hardware detected 页面
起因 最近厂里一批 dell 新机器 centos 6.3 装机卡在 Unsupported Hardware Detected 页面,要人肉点击 OK 才能继续装机: Unsupported Har ...
- 一个进程间同步和通讯的 C# 框架
转自原文 一个进程间同步和通讯的 C# 框架 threadmsg_demo.zip ~ 41KB 下载 threadmsg_src.zip ~ 65KB 下载 0.背景简介 微软在 .NE ...
- leetcode707
数据结构的题,从网上找到的实现方式,先记录下来. class MyLinkedList { public: /** Initialize your data structure here. */ My ...
- 黑暗之光 Day2
1. 鼠标点击UI检测 UICamera.isOverUI 2. 鼠标指针管理 public class CussorManager : MonoBehaviour { public static C ...
- AnimatorController即动画控制器创建的BUG
//-------------------------------------------------------------------------------------------------- ...
- PHP 动态添加 Mcrypt 扩展库
简介: PHP 动态添加 Mcrypt 扩展库,这是一个支持多种加密.解密算法.模式的扩展库. shell > php -m | grep mcrypt # 如果没有输出,就是缺少这个扩展 sh ...
- 从socket开始讲IOS网络编程
home list tags talk user rss Mac&iOS Socket 大纲 一.Socket简介 二.BSD Socket编程准备 1.地址 2.端口 3.网络字节序 4.半 ...
- Python常见字符串处理操作
Python中字符串处理的方法已经超过37种了,下面是一些常用的字符串处理的方法,以后慢慢添加. >>> s = 'Django is cool' #创建一个字符串 >> ...
- 前端开发之javascript BOM篇
主要内容: 1.BOM输出 2.BOM的对象 3.client的相关属性 4.offset的相关属性 5.scroll的相关属性 前情提要: 何谓BOM? 所谓 BOM 指的就是浏览器对象模型 Bro ...
- MySQL篇之Navicat可视化工具
主要内容: Navicat工具的介绍和使用 1.介绍和下载安装 <1>介绍 Navicat是一款针对MySQL数据库开发的可视化管理工具,以图形界面的形式操作MySQL数据库. 但在生产环 ...