我有一个使用20个线程的应用程序。这是一个使用线程发送邮件的电子邮件客户端。正在取消线程
当前线程在主线程中创建。但我想知道,如果我想取消整个操作怎么办?我能看到的唯一办法就是杀死主线......从而结束程序。
我需要创建一个线程来封装邮件的线程,这样我才能杀死封装线程?
我目前正在使用BackgroundWorker,它是一个WF应用程序。
我有一个使用20个线程的应用程序。这是一个使用线程发送邮件的电子邮件客户端。正在取消线程
当前线程在主线程中创建。但我想知道,如果我想取消整个操作怎么办?我能看到的唯一办法就是杀死主线......从而结束程序。
我需要创建一个线程来封装邮件的线程,这样我才能杀死封装线程?
我目前正在使用BackgroundWorker,它是一个WF应用程序。
如果您使用BackgroundWorker
,那么您已拥有取消操作所需的所有基础结构。只需在BackgroundWorker
上将WorkerSupportsCancellation
设置为true
,并在要取消时调用工作人员的CancelAsync
方法。
显然你必须编写工作者代码来履行取消。您可以通过检查BackgroundWorker
的CancellationPending
属性来执行此操作。
MSDN有一个example使用此属性。
注 - 我有点困惑BackgroundWorker
和20个线程的组合;一个BackgroundWorker
只使用一个线程本身。你是否脱掉了20 BackgroundWorkers
?如果是这样,你如何确保他们妥善处置?如果在Winforms应用程序中需要那么多的并发,那么最好使用异步委托或线程池。
如果要创建实际线程,实现取消标志的一种常用方法是使用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.
});
}
然后在某个点以后,如果你写cancelEvent.Set()
,每个工人会尽快,因为它击中了状态检查停止其工作。
是的,但不会取消当前线程吗?每个线程都设置为通过电子邮件从公司数据库中选择一组电子邮件。因此,如果我要取消该线程,其他19个仍然活着? – 2010-03-05 01:09:21
对不起,刚刚阅读回复的最后部分。 – 2010-03-05 01:09:38
您有20 Backgroundworker线程或使用它来开朗其他线程 – rerun 2010-03-05 00:57:48