环境:
假设我有一个主要的应用程序:
我有两个定时器:
timer1滴答中,应用程序正在检索新请求并将它们存储在Queue中,timer2滴答上,应用程序正在将一个请求排在队列中,以便在一个新的Thread中执行任务。当用户要求停止所有任务以释放资源时,我计划简单地用Thread.Abort()关闭运行当前任务的线程。
问题:
我希望能够在从线程类中删除线程时保存一些最后的配置。
问题:
是否有一种方法来检测线程何时被杀死,比如一个Thread.OnAborting()事件?
或者,我可以捕获调用ThreadAbortException方法时引发的Thread.Abort()吗?(如果是这样的话,我真的不知道怎么做,你能提供一些代码示例吗?)
发布于 2011-07-20 13:55:31
除了捕获ThreadAbortException之外,不存在其他机制。当然,您确实不想调用Thread.Abort,因为ThreadAbortException是异步注入的,而这些注入点可能是不可预测的。例如,它可能处于写的中间,这可能会使整个AppDomain处于损坏状态。.NET 2.0添加了约束执行区域,这使得处理线程中止变得更安全和更容易处理,但是编写一段能够保证AppDomain不会被破坏的代码仍然是非常困难的。我的建议是在Thread.Abort的想法上下注。
相反,您想要做的是向线程发送一个信号,并允许它自行优雅地终止。这可以通过以下机制来完成。
Thread.Interrupt您可以看到我的答案这里获得更多信息。
发布于 2011-07-20 13:57:20
如何在.NET中停止线程(以及为什么Thread.Abort是邪恶的)
发布于 2011-07-20 14:05:15
莱托,它可能是通过简单设置标志或发出事件或信号来设计可中断任务的最佳方法。遗憾的是,您为我提供了更少的详细信息,以便为您提供准确的代码片段,但一个可能的、非常基本的解决方案可能是:
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()。它只会让你头疼。
https://stackoverflow.com/questions/6763015
复制相似问题