.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"));
上一篇:Linux 安装swoole扩展


下一篇:SSMS2008插件开发(2)--Microsoft Visual Studio 2008插件开发介绍