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

标签 c# multithreading exception

环境:

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

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

我有两个计时器:

  • timer1 时刻,应用程序正在检索新请求并将它们存储在 Queue 中,
  • timer2 节拍上,应用程序正在出列一个请求以在新的 Thread 中执行任务。

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

问题:

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

问题:

有没有办法检测线程何时被终止,比如 Thread.OnAborting() 事件?

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

最佳答案

除了捕获 ThreadAbortException 外,不存在其他机制。当然,您真的不希望调用 Thread.Abort,因为 ThreadAbortException 是异步注入(inject)的,而且这些注入(inject)点是不可预测的。例如,它可能处于写入过程中,这可能会使整个 AppDomain 处于损坏状态。添加了 .NET 2.0 constrained execution regions这使得处理线程中止变得更安全、更容易处理,但是编写一段代码来保证 AppDomain 不会被破坏仍然难以置信困难。我的建议是押注 Thread.Abort 想法。

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

  • 投票一个标志
  • 使用等待句柄
  • 调用Thread.Interrupt
  • 使用内置于长时间运行操作的 API 中的取消机制

可以看到我的回答here获取更多信息。

关于c# - 是否存在像 Thread.OnAborting() 这样的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6763015/

相关文章:

c# - System.Type 的任何方法都可以抛出 SecurityException 吗?

java - Java 中异常的速度

python - while 循环删除数据存储中的数据

c# - 在不使用语句的情况下使用 Entity Framework 的缺点?

c# - 为什么零长度的 Send() 在错误的 TCP 套接字连接上不会失败?

c# - 如何在 C# 和非托管 C++ 库之间传递对指针的引用?

java - volatile 关键字有什么用?

c++ - C++11 中的静态变量初始化是同步的吗?

java - 让一个线程启动另一个线程然后死掉

ruby-on-rails - Controller 中的 Rails 异常执行查询实例变量?