首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否存在像Thread.OnAborting()这样的事件?

是否存在像Thread.OnAborting()这样的事件?
EN

Stack Overflow用户
提问于 2011-07-20 13:48:35
回答 3查看 112关注 0票数 1

环境:

假设我有一个主要的应用程序:

  • 倾听任务的请求,
  • 一个接一个地执行这些任务(使用一些资源(在物理意义上)),
  • 必须能够立即停止挂起的任务来释放资源。

我有两个定时器:

  • timer1滴答中,应用程序正在检索新请求并将它们存储在Queue中,
  • timer2滴答上,应用程序正在将一个请求排在队列中,以便在一个新的Thread中执行任务。

当用户要求停止所有任务以释放资源时,我计划简单地用Thread.Abort()关闭运行当前任务的线程。

问题:

我希望能够在从线程类中删除线程时保存一些最后的配置。

问题:

是否有一种方法来检测线程何时被杀死,比如一个Thread.OnAborting()事件?

或者,我可以捕获调用ThreadAbortException方法时引发的Thread.Abort()吗?(如果是这样的话,我真的不知道怎么做,你能提供一些代码示例吗?)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-20 13:55:31

除了捕获ThreadAbortException之外,不存在其他机制。当然,您确实不想调用Thread.Abort,因为ThreadAbortException是异步注入的,而这些注入点可能是不可预测的。例如,它可能处于写的中间,这可能会使整个AppDomain处于损坏状态。.NET 2.0添加了约束执行区域,这使得处理线程中止变得更安全和更容易处理,但是编写一段能够保证AppDomain不会被破坏的代码仍然是非常困难的。我的建议是在Thread.Abort的想法上下注。

相反,您想要做的是向线程发送一个信号,并允许它自行优雅地终止。这可以通过以下机制来完成。

  • 投旗
  • 使用等待句柄
  • 调用Thread.Interrupt
  • 使用内置在长期运行操作的APIs中的取消机制。

您可以看到我的答案这里获得更多信息。

票数 5
EN

Stack Overflow用户

发布于 2011-07-20 13:57:20

如何在.NET中停止线程(以及为什么Thread.Abort是邪恶的)

票数 1
EN

Stack Overflow用户

发布于 2011-07-20 14:05:15

莱托,它可能是通过简单设置标志或发出事件或信号来设计可中断任务的最佳方法。遗憾的是,您为我提供了更少的详细信息,以便为您提供准确的代码片段,但一个可能的、非常基本的解决方案可能是:

代码语言:javascript
复制
class MyTask
{
    bool bShouldDoWork;

    public event EventHandler Aborted;

    public void DoWork()
    {    
         bShouldDoWork = true;          

         while(bShouldDoWork)
         {
              //Do work.
              //But ensure that the loop condition is checked often enough to
              //allow a quick and graceful termination. 
         }

         if(Aborted != null)
         {
              //Fire event
              Aborted(this, EventArgs.Empty);
         }
    }

    //Call this method from another thread, for example
    //when a button is pressed in your UI etc.
    public void Abort()
    {
         bShouldDoWork = false;
    }
}

请注意,这个片段是非常基本的,可能需要修改以满足您的需要。我希望它能帮助你抓住正确的多线程的想法。

请不要使用Thread.Abort()。它只会让你头疼。

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

https://stackoverflow.com/questions/6763015

复制
相关文章

相似问题

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