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(); } }