是否存在像 Thread.OnAborting() 这样的事件
本文关键字:事件 存在 Thread OnAborting 是否 | 更新日期: 2023-09-27 18:02:47
环境:
假设我有一个主要应用程序:
- 侦听要执行的任务的请求,
- 一个接一个地执行这些任务(使用一些资源(在物理意义上((,
- 必须能够立即停止挂起的任务以释放资源。
我有两个计时器:
- 在
timer1
刻度上,应用程序正在检索新请求并将其存储在Queue
中, - 在
timer2
,应用程序正在取消排队请求以在新Thread
中执行任务。
当用户要求停止所有任务以释放资源时,我计划简单地使用 Thread.Abort()
杀死运行当前任务的线程。
问题:
我希望能够在从线程类中杀死线程时保存一些最后的配置。
问题:
有没有办法检测线程何时被杀死,比如Thread.OnAborting()
事件?
或者,也许我可以抓住调用Thread.Abort()
方法时引发的ThreadAbortException
?(如果是这样,我真的不知道该怎么做,你能提供一些代码示例吗?
除了捕获ThreadAbortException
之外,不存在其他机制。当然,您真的不想调用Thread.Abort
,因为ThreadAbortException
是异步注入的,并且这些注入点可能是不可预测的。例如,它可能在写入过程中,这可能会使整个AppDomain处于损坏状态。.NET 2.0 添加了受约束的执行区域,这使得处理线程中止更加安全且更容易处理,但创作可以保证 AppDomain 不会损坏的代码块仍然非常困难。我的建议是Thread.Abort
的想法。
相反,您要做的是向线程发送信号并允许它自行优雅地终止。这可以通过以下机制完成。
- 轮询标志
- 使用等待句柄
- 呼叫
Thread.Interrupt
- 使用长时间运行操作的 API 中内置的取消机制
你可以在这里看到我的答案以获取更多信息。
如何在 .NET 中停止线程(以及为什么 Thread.Abort 是邪恶的(
Leito,这可能是通过简单地设置标志或发出事件或信号来设计可中断任务的最佳方式。可悲的是,您为我提供了较少的详细信息来为您提供确切的代码片段,但一个可能的、非常基本的解决方案可能是:
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((。它只会让你头疼。