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 线程池的更多相关文章

  1. Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量

    Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量 一丶线程的理论知识 什么是线程:    1.线程是一堆指令,是操作系统调度 ...

  2. java线程基础巩固---线程生命周期以及start方法源码剖析

    上篇中介绍了如何启动一个线程,通过调用start()方法才能创建并使用新线程,并且这个start()是非阻塞的,调用之后立马就返回的,实际上它是线程生命周期环节中的一种,所以这里阐述一下线程的一个完整 ...

  3. 014-多线程-基础-Exchanger-行线程间的数据交换

    一.简介 Exchanger类允许在两个线程之间定义同步点,当两个线程都到达同步点时,它们交换数据.也就是第一个线程的数据进入到第二个线程中,第二线程的数据进入到第一个线程中. Exchanger可以 ...

  4. java线程基础巩固---线程生产者消费者的综合实战结合Java8语法

    基于上一次[http://www.cnblogs.com/webor2006/p/8909558.html]学习的多个生产者与多个消费者模型,此次用另外一个案例来进一步巩固线程之间的调度处理,这里还是 ...

  5. java线程基础知识----线程与锁

    我们上一章已经谈到java线程的基础知识,我们学习了Thread的基础知识,今天我们开始学习java线程和锁. 1. 首先我们应该了解一下Object类的一些性质以其方法,首先我们知道Object类的 ...

  6. java线程基础知识----线程基础知识

    不知道从什么时候开始,学习知识变成了一个短期记忆的过程,总是容易忘记自己当初学懂的知识(fuck!),不知道是自己没有经常使用还是当初理解的不够深入.今天准备再对java的线程进行一下系统的学习,希望 ...

  7. java线程基础巩固---线程间通信快速入门,使用wait和notify进行线程间的数据通信

    之前已经对于线程同步相关的知识点进行了详细的学习,这次来学习一下线程间的通信相关的知识,话不多说直接用代码进行演练,以一个简陋的生产者消费者模型来初步了解下线程间通信是怎么一回事. 生产消费者第一版: ...

  8. java线程基础巩固---线程ID,优先级

    这里学习Thread的两个比较简单的API,直接上代码: 线程ID: 那它的生成规则是?直接看源码: 那为什么目前打印是9呢?然后在jvm启动的时候就已经创建了8个线程?继续用jconsole来验证一 ...

  9. C#多线程编程系列(二)- 线程基础

    目录 C#多线程编程系列(二)- 线程基础 1.1 简介 1.2 创建线程 1.3 暂停线程 1.4 线程等待 1.5 终止线程 1.6 检测线程状态 1.7 线程优先级 1.8 前台线程和后台线程 ...

随机推荐

  1. PHP mysql client封装

    config1.inc.php $CONFIG_DATABASE_TXL = array( #array('127.0.0.1', 'root', '', 'he_txl','3306') array ...

  2. Android中SharePreferences的简单实现

    Android中提供SharePreferences这种轻量级的数据存储模式,这种模式能够存储少量数据,并能为自身和其他应用提供数据接口.相对于其他数据存储方式,SharePreferences更加轻 ...

  3. yarn学习

  4. maven-resources-plugin使用

    命令行中带参数指定${}变量值 <build> <resources> <resource> <directory>src/main/resources ...

  5. Oracle11gR2导入导出实战之物化视图prebuilt

    源实例上创建表 物化视图 oracle@localhost admin]$ sqlplus system/oracle@orcl2 SQL*Plus: Release 11.2.0.4.0 Produ ...

  6. 开发团队(Team)的主要职责和特征

    角色介绍 开发团队是Scrum团队的三个角色之一. 开发团队包括架构师.开发工程师.测试人员.数据库管理员和UI设计师等,这几类人的跨职能组合.具备的技能足以实现产品开发. Team的主要职责 1.S ...

  7. iOS学习之UIPickerView控件的关联选择

    接上篇iOS学习之UIPickerView控件的简单使用 接着上篇的代码 http://download.csdn.net/detail/totogo2010/4391870 ,我们要实现的效果如下: ...

  8. ArraySegment的用法

    string[] myArr = { "Overred", "Medloy", "Xiaoguai", "Hare" } ...

  9. 值得一做》关于一道暴搜BZOJ1024(EASY+)

    为什么要写这道题的DP捏? 原因很简单,因为为原来在openjudge上有一道题叫分蛋糕,有一个思路和这道题很像:“分锅”. 分锅:即为考虑计算当前情况的最优解时,把当前状态结果,分散为考虑当前状态的 ...

  10. 141. Linked List Cycle (List; Two-Pointers)

    Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using ex ...