环境:
假设我有一个主应用程序:
- 听取任务请求,
- 一个接一个地执行那些任务(使用一些资源(在物理意义上)),
- 必须能够立即停止挂起的任务以释放资源。
我有两个计时器:
- 在
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/