环境:
假设我有一个主要应用程序:
我有两个计时器:
timer1
刻度线上,应用程序正在检索新请求并将其存储在Queue
,timer2
刻度线上,应用程序将使用新Thread
执行任务的请求出列。当用户要求停止所有任务以释放资源时,我打算用Thread.Abort()
简单地杀死运行当前任务的线程。
问题:
我希望能够在从线程类中删除线程时保存一些最后的配置。
问题:
有没有办法检测线程何时被杀死,比如Thread.OnAborting()
事件?
或者也许我可以在调用Thread.Abort()
方法时抓住ThreadAbortException
? (如果是这样,我真的不知道该怎么做,你能提供一些代码示例吗?)
答案 0 :(得分:5)
除了捕获ThreadAbortException
之外,没有其他机制存在。当然,你真的不想调用Thread.Abort
,因为ThreadAbortException
是异步注入的,那些注入点可能是不可预测的。例如,它可能处于写入的中间,这可能使整个AppDomain处于损坏状态。 .NET 2.0增加了constrained execution regions,这使得处理线程中止更安全,更容易处理,但是仍然难以置信难以创建一个代码块,可以保证AppDomain不会变得腐败。我的建议是试探Thread.Abort
的想法。
相反,您要做的是向线程发送信号并允许它自己优雅地终止。这可以通过以下机制来完成。
Thread.Interrupt
您可以查看我的回答here以获取更多信息。
答案 1 :(得分:1)
答案 2 :(得分:1)
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()。它只会给你带来很多麻烦。