.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"));

 

posted @ 2016-04-16 17:30  dragon.net  阅读(882)  评论(0编辑  收藏  举报