当条件满足时优雅地中止线程

本文关键字:线程 条件 满足 | 更新日期: 2023-09-27 18:02:17

假设我启动了两个独立的(互斥的?)线程,最后有一个通知,通知一切都完成了。

这是一个优雅的方式来中止线程超出某些条件吗?我使用Framework 4.

谢谢。

 Console.WriteLine(DateTime.Now);
 DateTime StartNow = DateTime.Now;
 Thread thread = new Thread(() => RunsLongTime());
 thread.Start();
 Thread thread1 = new Thread(() => RunsEvenLonger());
 thread1.Start();
 DateTime RightNow = DateTime.Now;
 for (; ; )
 {
     if (RightNow >= StartNow.AddHours(1)) // A condition
     {
         thread.Abort();
         thread1.Abort();
         Console.WriteLine("ABORTED AT: " + DateTime.Now);
         break;
     }
     RightNow = DateTime.Now;
 }

当条件满足时优雅地中止线程

显然,要做的是使用CancellationTokenSource——它产生一个CancellationToken,线程可以监视并响应它。

你可以在它构造的时候用超时值初始化它,或者你可以在线程退出的时候调用Cancel

关于合作取消模型的更多细节,请参阅托管线程中的取消。唯一干净/优雅的工作方式是合作。在。net 4之前,可以使用各种特殊的方法(例如ManualResetEvent s),但是现在CancellationToken已经被融入到许多api中,它是实现此功能的最佳(当前)方法。