C# 取消线程

C# 取消线程,c#,C#,我有一个使用20个线程的应用程序。它是一个电子邮件客户端,使用线程发送邮件 当前线程是在主线程中创建的。但是我想知道,如果我想取消整个手术怎么办?我能看到的唯一方法就是杀死主线程。。。从而结束了节目 我是否必须创建一个线程来封装邮件线程,这样我就可以杀死封装线程 顺便说一下,我目前正在使用BackgroundWorker,它是一个WF应用程序。如果您使用的是BackgroundWorker,那么您已经拥有了取消操作所需的所有基础结构。只需在BackgroundWorker上将WorkerSupp

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

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

我是否必须创建一个线程来封装邮件线程,这样我就可以杀死封装线程


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

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

很明显,你必须写工人代码来接受取消。您可以通过检查
BackgroundWorker
CancellationPending
属性来执行此操作

MSDN具有使用此属性的权限


注意-我对
BackgroundWorker
和20个线程的组合感到有点困惑;
BackgroundWorker
本身只使用一个线程。您是否正在剥离20名后台员工?如果是这样,您如何确保它们得到适当处置?如果在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.
    });
}
ManualResetEvent cancelEvent=新的ManualResetEvent(假);
对于(int i=0;i<20;i++)
{
ThreadPool.QueueUserWorkItem(s=>
{
//做些工作
if(cancelEvent.watone(0,true))
返回;
//多做些工作
//等等。
});
}

然后,在以后的某个时候,如果您编写
cancelEvent.Set()
,每个工作线程都会在完成状态检查后立即停止工作。

您有20个Backgroundworker线程或使用它启动其他线程,但这不就是取消当前线程吗?每个线程都设置为从公司数据库发送一组选定的电子邮件。所以如果我取消了那个线程,其他19个线程还活着,对吗?