我有一个使用20个线程的应用程序。这是一个使用线程从邮件发送邮件的电子邮件客户端。
目前,线程是在主线程中创建的。但我想知道,如果我想取消整个操作怎么办?我能看到的唯一方法是杀死主线程......从而结束程序。
我是否必须创建一个封装线程以进行邮寄的线程,以便我可以杀死封装线程?
我目前正在使用BackgroundWorker,它是一个WF应用程序。
答案 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.
});
}
,每个工人一旦到达状态检查就会停止工作。