2010-03-05 64 views
3

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

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

我需要创建一个线程来封装邮件的线程,这样我才能杀死封装线程?

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

+0

您有20 Backgroundworker线程或使用它来开朗其他线程 – rerun 2010-03-05 00:57:48

回答

3

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

显然你必须编写工作者代码来履行取消。您可以通过检查BackgroundWorkerCancellationPending属性来执行此操作。

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(),每个工人会尽快,因为它击中了状态检查停止其工作。

+0

是的,但不会取消当前线程吗?每个线程都设置为通过电子邮件从公司数据库中选择一组电子邮件。因此,如果我要取消该线程,其他19个仍然活着? – 2010-03-05 01:09:21

+0

对不起,刚刚阅读回复的最后部分。 – 2010-03-05 01:09:38