首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >需要线程终止建议

需要线程终止建议
EN

Stack Overflow用户
提问于 2013-10-11 12:20:36
回答 3查看 83关注 0票数 1

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

但是线程实际上并没有终止,它仍然在完成外部进程。有没有什么办法可以立即终止一个线程。

我没有对外部处理的控制,所以不能发送任何标志的方法,如while (checkThreadCancelled){}

下面是我的伪代码。

有什么帮助吗?

代码语言:javascript
运行
复制
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();
}
EN

回答 3

Stack Overflow用户

发布于 2013-10-11 12:41:05

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

当您的工作线程正在执行DLL中的某些内容时,CLR不在控制范围内,因此它没有抛出异常的选项。

您可以选择使用Win32 TerminateThread应用编程接口,但这样做是非常严重的,并且可能会也可能不会导致进程内的损坏。TerminateThread实际上不是您应该选择的选项。

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2013-10-11 12:33:43

您不想使用Thread.Abort,这通常被认为是不好的做法。上面有很多问题,所以提供了一些很好的解释。例如:Timeout Pattern - How bad is Thread.Abort really?

试着看看TasksCancellationTokens。请参阅MSDN文章:http://msdn.microsoft.com/en-us/library/dd997396.aspx

票数 1
EN

Stack Overflow用户

发布于 2013-10-11 14:28:57

试试这个:

代码语言:javascript
运行
复制
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();                   
            }

它将停止当前线程进程,并取消该线程上正在进行的操作。也许它能帮到你

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19310185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档