C# 需要线程终止建议

C# 需要线程终止建议,c#,wpf,multithreading,C#,Wpf,Multithreading,我正在使用BackgroundWorker处理长时间运行的外部操作。但是,用户可以选择取消后台操作。因为我的自定义BackgroundWorker支持Thread.Abort(),所以当用户从主线程触发Cancel时,我所做的就是BackgroundWorker.Abort() 但是线程实际上并没有终止,它仍然在完成外部进程。有没有任何方法可以立即终止线程 我无法控制外部处理,因此无法发送任何方法标志,如while(checkThreadCancelled){} 下面是我的伪代码 有什么帮助吗

我正在使用
BackgroundWorker
处理长时间运行的外部操作。但是,用户可以选择取消后台操作。因为我的自定义BackgroundWorker支持
Thread.Abort()
,所以当用户从主线程触发Cancel时,我所做的就是
BackgroundWorker.Abort()

但是线程实际上并没有终止,它仍然在完成外部进程。有没有任何方法可以立即终止线程

我无法控制外部处理,因此无法发送任何方法标志,如
while(checkThreadCancelled){}

下面是我的伪代码

有什么帮助吗

AbortableBackgroundWorker _bgWorker;

void MainThreadFunc()
{
    _bgWorker = new AbortableBackgroundWorker();
    _bgWorker.DoWork += new DoWorkEventHandler(bg_DoWork);
    _bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler
                    ( bg_RunWorkerCompleted );
    _bgWorker.WorkerSupportsCancellation = true; 
    _bgWorker.RunWorkerAsync();
}

void bg_DoWork()
{
    //Call external dll function for processing
}

void bg_RunWorkerCompleted()
{

   //Process completed code
}

void CancelBgProcess()
{
   if(_bgWorker != null)
      _bgWorker.Abort();
}

您不想使用
线程.Abort
,这通常被认为是不好的做法。有很多问题被问到,因此提供了一些很好的解释。例如:


尝试查看
任务
取消令牌
。请参阅这篇MSDN文章:

如果您不想使用
线程。中止
,这通常被认为是不好的做法。有很多问题被问到,因此提供了一些很好的解释。例如:


尝试查看
任务
取消令牌
。请参阅此MSDN文章:

中止方法依赖于工作线程与之协作。最终,它会导致CLR抛出一个异常,指示线程将中止,线程可以随意处理该异常

由于工作线程正在DLL中执行某些操作,CLR无法控制,因此它没有引发异常的选项

您可以选择使用Win32 TerminateThread API,但这样做很严重,可能会或可能不会导致进程中的损坏。TerminateThread实际上不是您应该选择的选项

由于您无法修改正在调用的库,因此剩下两个选项。第一种也是最简单的方法是降低后台线程的优先级,忽略它在取消后继续运行的事实

第二种方法是在单独的进程而不是线程中启动后台操作。此时,如果操作被取消,您可以终止整个过程。如果您走这条路线,您将需要选择某种形式的IPC来传递库的输入和输出参数


任务
取消令牌
在这种情况下最终对您没有帮助,因为您将在同一个位置结束:执行不与您合作的库代码以便取消。

中止方法依赖于工作线程与其合作。最终,它会导致CLR抛出一个异常,指示线程将中止,线程可以随意处理该异常

由于工作线程正在DLL中执行某些操作,CLR无法控制,因此它没有引发异常的选项

您可以选择使用Win32 TerminateThread API,但这样做很严重,可能会或可能不会导致进程中的损坏。TerminateThread实际上不是您应该选择的选项

由于您无法修改正在调用的库,因此剩下两个选项。第一种也是最简单的方法是降低后台线程的优先级,忽略它在取消后继续运行的事实

第二种方法是在单独的进程而不是线程中启动后台操作。此时,如果操作被取消,您可以终止整个过程。如果您走这条路线,您将需要选择某种形式的IPC来传递库的输入和输出参数

任务
取消令牌
在这种情况下最终对您没有帮助,因为您将在同一个地方结束:执行不与您合作的库代码以便取消。

尝试以下方法:

if (_bgWorker.IsBusy)
            {
                _bgWorker.WorkerSupportsCancellation = true;
                //To cancel the Thread if Closing the Application
                //while the Background Thread Worker is Still running on Background.
                _bgWorker.CancelAsync();                   
            }
它将停止当前线程进程并取消该线程上正在进行的操作。 也许它对你有帮助

试试这个:

if (_bgWorker.IsBusy)
            {
                _bgWorker.WorkerSupportsCancellation = true;
                //To cancel the Thread if Closing the Application
                //while the Background Thread Worker is Still running on Background.
                _bgWorker.CancelAsync();                   
            }
它将停止当前线程进程并取消该线程上正在进行的操作。 也许对你有帮助