线程 终止

线程终止和线程启动一样,并不是即时模式。

类似于使用 Thread.Abor();去终止线程,如果 Thread未执行完线程内的非托管代码时,是不会出现ThreadAborException。但是当Thread 执行到CLR的时候,才会抛出异常。

线程终止机制:如果线程需要终止,Thread位开发者提供了接口:Cancled。线程在工作时,还会以某种频率检测Cancled,当检测到Cancled 时 线程会自动停止。

FCL(Framework class library 即类库)为我们提供了标准的取消模式:协作取消模式(Cooperative Cancelletion),下面是简单的使用实例

        CancellationTokenSource cancel = new CancellationTokenSource();            
       Thread t = new Thread(() =>
            {
                while (true)
                {
                    //检测到停止标识
                    if (cancel.IsCancellationRequested)
                    {
                        Console.WriteLine("线程已停止" + DateTime.Now);
                        break;
                    }
                    Console.WriteLine(DateTime.Now);
                    Thread.Sleep(1000);
                }
            });
            //t.Priority = ThreadPriority.Highest;
            t.IsBackground = true;
            t.Start();
            cancel.Cancel();
            Console.WriteLine("线程已启动" + DateTime.Now);

调用者通过CancellationTokenSource的 Cancel() 通知工作线程退出。而线程则以 每1000ms的频率去检测Cancel的取消标识。

协议式终止线程中使用的关键类 CancellationTokenSource。 其中它有一个属性 Token 提供了IsCancellationRequested 标识来判断是否停止线程。它还有一个回调方法需要注意Register();

            cancel.Token.Register(()=> {
                Console.WriteLine("线程终止回调函数" + DateTime.Now);
            });

 

posted @ 2017-08-10 15:40  诗错り亦染  阅读(115)  评论(0编辑  收藏  举报