.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(4000); Console.WriteLine("In ComputeBoundOp:State={0}", state); }, 5); 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, 10)); 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 = 0; count < countTo; count++) { if (token.IsCancellationRequested) { Console.WriteLine("Count is cancellen"); break; } Console.WriteLine("count:{0}", count); Thread.Sleep(2000); } Console.WriteLine("Count is done"); }
CancellationTokenSource 的 Token.Register 回调委托:
//当执行 cts.Cancel(); 会输出如下文本 cts.Token.Register(() => Console.WriteLine("Canceled 1")); cts.Token.Register(() => Console.WriteLine("Canceled 2"));