线程 终止
线程终止和线程启动一样,并不是即时模式。
类似于使用 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); });