需要线程终止建议
本文关键字:终止 线程 | 更新日期: 2023-09-27 18:34:47
我正在使用BackgroundWorker
来处理长时间运行的外部操作。但是,用户可以选择取消后台操作。由于我的自定义后台工作者支持Thread.Abort()
,我所做的只是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 方法依赖于与其协作的工作线程。最终,它会导致 CLR 引发异常,指示线程要中止,线程可以随意处理。
由于工作线程正在执行 DLL 中的某些内容,因此 CLR 不受控制,因此它没有引发异常的选项。
您可以选择使用 Win32 终止线程 API,但这样做很严重,可能会导致也可能不会导致进程中的损坏。终止线程并不是您应该选择的选项。
由于您无法修改正在调用的库,因此您有两个选择。第一种方法也是最简单的方法,降低后台线程的优先级,并忽略它在取消后继续运行的事实。
第二种是在单独的进程中启动后台操作,而不是在线程中启动。此时,如果操作被取消,您可以终止整个过程。如果采用此路线,则需要选择某种形式的 IPC 来传达库的输入和输出参数。
在这种情况下,Tasks
和CancellationTokens
最终不会帮助您,因为您最终会处于同一个位置:执行不与您合作的库代码以被取消。
你不想使用Thread.Abort
,这通常被认为是不好的做法。关于SO提出了许多问题,提供了一些非常好的解释。例如:超时模式 - Thread.Abort 到底有多糟糕?
尝试查看Tasks
和CancellationTokens
。请参阅此 MSDN 文章:http://msdn.microsoft.com/en-us/library/dd997396.aspx
试试这个:
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();
}
它将停止当前线程进程,并取消该线程上的持续操作。也许它可以帮助你