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

时间:2014-05-08 14:07:22

标签: c# .net multithreading

假设我有两个独立的(互斥的?)线程,我会在最后发出通知,通知所有内容已完成。

这是一种优雅的方式来中止超出某些条件的线程吗?我使用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;
 }

1 个答案:

答案 0 :(得分:1)

嗯,显而易见的事情是使用CancellationTokenSource - 它产生一个线程可以监视和响应的CancellationToken

您可以在构造时使用超时值对其进行初始化,也可以在线程退出时调用Cancel

有关此合作取消模式的详细信息,请参阅Cancellation in Managed Threads。唯一干净/优雅的工作方式是合作方式。在.NET 4之前,可以使用各种ad-hoc方法(例如ManualResetEvent s),但现在CancellationToken已经融入许多API,它是实现的最佳(当前)方式此