• .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"));
  • 相关阅读:
    Outlook同步问题
    Excel下三角图解的绘制
    数据库,SQL,万恶之源?
    新年第一篇
    ArcGIS的GeoProcessing的原理及实现(1)
    如何在多个文件中查找需要的信息
    关于GIS门户(GIS Portal)的概念
    2004总结
    MapViewControl更新
    GCDPlot 0.22 介绍
  • 原文地址:https://www.cnblogs.com/dragon-L/p/5398871.html
Copyright © 2020-2023  润新知