好吧,OO 的答案是将线程列表作为一个字段。
private readonly List<Thread> threads = new List<Thread>();
然后将新构造的线程添加到第一个处理程序的列表中。
var thread = new Thread(myfunc);
thread.Start();
threads.Add(thread);
然后您可以遍历第二个处理程序中的每个线程,依次中止它们中的每一个。
foreach(var thread in threads)
thread.Abort();
但我认为这里最重要的一点是,几乎从来没有一个好的理由打电话Thread.Abort
。
从MSDN 页面:
当线程对自身调用 Abort 时,效果类似于抛出异常;ThreadAbortException 立即发生,结果是可预测的。但是,如果一个线程在另一个线程上调用 Abort,则中止会中断正在运行的任何代码。静态构造函数也有
可能被中止。
在极少数情况下,这可能会阻止在该应用程序域中创建该类的实例。在 .NET Framework 1.0 和 1.1 版本中,线程有可能在 finally 块运行时中止,在这种情况下finally 块被中止。
如果正在中止的线程位于代码的受保护区域(例如 catch 块、finally 块或受约束的执行区域)中,则调用 Abort 的线程可能会阻塞。如果调用 Abort 的线程持有被中止线程所需的锁,则可能发生死锁。
使用某种形式的信号会更好,例如设置ManualResetEvent
每个线程将以周期间隔轮询。或者,您可以使用BackgroundWorker
支持取消任务的类(调用CancelAsync
它,并让工作线程CancellationPending
定期测试)。如果您使用的是 .NET 4.0,则还可以使用TPL。