取消线程

时间:2010-03-05 00:53:43

标签: c#

我有一个使用20个线程的应用程序。这是一个使用线程从邮件发送邮件的电子邮件客户端。

目前,线程是在主线程中创建的。但我想知道,如果我想取消整个操作怎么办?我能看到的唯一方法是杀死主线程......从而结束程序。

我是否必须创建一个封装线程以进行邮寄的线程,以便我可以杀死封装线程?

我目前正在使用BackgroundWorker,它是一个WF应用程序。

1 个答案:

答案 0 :(得分:3)

如果您使用的是BackgroundWorker,那么您已经拥有取消操作所需的所有基础设施。只需在WorkerSupportsCancellation上将true设置为BackgroundWorker,并在取消时调用工作人员的CancelAsync方法。

显然,您必须编写工作人员代码以兑现取消。您可以通过查看CancellationPending的{​​{1}}属性来执行此操作。

MSDN使用此属性example


注意 - 我对BackgroundWorker和20个线程的组合感到有点困惑; BackgroundWorker本身只使用一个线程。你是在离开20 BackgroundWorker吗?如果是这样,你如何确保他们妥善处置?如果在Winforms应用程序中需要那么多的并发性,那么最好使用异步委托或线程池。

如果要创建实际线程,实现取消标记的一种常用方法是使用BackgroundWorkers。如果等待此事件且超时为零,则它将充当线程安全状态标志。一个示例用法是:

ManualResetEvent

然后在某些时候,如果你写ManualResetEvent cancelEvent = new ManualResetEvent(false); for (int i = 0; i < 20; i++) { ThreadPool.QueueUserWorkItem(s => { // Do some work if (cancelEvent.WaitOne(0, true)) return; // Do some more work // etc. }); } ,每个工人一旦到达状态检查就会停止工作。