• 线程池


     class Program
        {
            static void Main(string[] args)
            {
                {
                    //线程池初识
                    //Console.WriteLine("Main:");
                    //ThreadPool.QueueUserWorkItem(s =>
                    //{
                    //    Console.WriteLine("this is treadpool :" + s);
                    //}, 100);
                    //Thread.Sleep(1);
                    //Console.WriteLine("hello world");
                }
                {
                    //执行上下文
                    ////将数据放置Main函数逻辑调用上下文中
                    //CallContext.LogicalSetData("name", "wjire");
                    ////阻止“流向”之前(可以获得逻辑调用上下文数据)
                    //ThreadPool.QueueUserWorkItem(s =>
                    //{
                    //    Console.WriteLine($"name={CallContext.LogicalGetData("name")}");
                    //});
                    ////阻止“流向”
                    //ExecutionContext.SuppressFlow();
    
                    ////阻止“流向”之后(不可获得逻辑调用上下文数据)
                    //ThreadPool.QueueUserWorkItem(s =>
                    //{
                    //    Console.WriteLine($"name={CallContext.LogicalGetData("name")}");
                    //});
                    ////恢复“流向”
                    //ExecutionContext.RestoreFlow();
                }
                {
                    //取消操作
                    CancellationTokenSource cts = new CancellationTokenSource();
                    //线程取消时,执行的回调方法.
                    //1.0后登记的先执行.
                    //2.0如果cancel()方法没法有入参,则默认是false,这种情况下,所有的回调方法都会执行,最终统一抛出一个异常.
                    //3.0如果cancel()方法入参是true,则抛出异常的回调方法会阻止后续的回调方法的执行.
                    var r1 = cts.Token.Register(() =>
                     {
                         Console.WriteLine("1");
                     });
    
                    var r2 = cts.Token.Register(() =>
                     {
                         Thread.Sleep(2000);
                         Console.WriteLine("2");
                         throw new Exception("this is 2 exception");
                     });
                    ThreadPool.QueueUserWorkItem(s =>
                    {
                        for (int i = 0; i < 10000; i++)
                        {
                            if (cts.Token.IsCancellationRequested)
                            {
                                Console.WriteLine("the thread is cancel");
                                break;
                            }
                            Console.WriteLine("i={0}", i);
                            Thread.Sleep(1000);
                        }
                    });
                    //删除已登记的回调方法.
                    //r2.Dispose();
    
                    //3秒钟之后自动取消
                    //cts.CancelAfter(3000);
                    Console.ReadKey();
                    cts.Cancel();
                }
    
                Console.Read();
            }
        }
  • 相关阅读:
    hdu 1016 Prime Ring Problem (dfs)
    微信小程序尝鲜一个月现状分析
    创新大师Steve Blank: 你真的知道什么是真正的精益创业吗?
    android studio 开发经常使用快捷键使用分享
    LeetCode:Partition List
    2016 博客导读总结 &amp; 个人感悟
    poj
    Android开之在非UI线程中更新UI
    浅谈数据库生命周期
    从AdventureWorks学习数据库建模——保留历史数据
  • 原文地址:https://www.cnblogs.com/refuge/p/10052845.html
Copyright © 2020-2023  润新知