小介绍:
在复杂的多线程应用程序(企业服务总线 ESB)中,我需要使用 Thread.Abort,因为这个 ESB 接受用户编写的与硬件安全模块通信的模块。因此,如果此模块死锁或硬件停止响应 - 我只需卸载此模块,此服务器应用程序的其余部分必须继续运行。
所以有中止同步机制确保代码只能在用户部分中止,并且该部分必须标记为 AbortAble。如果发生这种情况(中止),则有可能在这段代码中抛出 ThreadAbortException:
public void StopAbortSection()
{
var id = Thread.CurrentThread.ManagedThreadId;
lock (threadIdMap[id])
{
....
}
}
例如模块在 AbortSection(通过调用类似方法 StartAbortSection 进入),ServerAplication 决定中止用户模块,但在此决定之后但在实际 Thread.Abort 之前,模块通过调用此方法进入 NonAbortableSection,但实际上对该锁定对象进行了锁定.
所以 lock 将阻塞直到 Abort 被执行,但是 abort 也可以在到达这段代码中的这个块之前被执行。但是使用这种方法的对象是必不可少的,我需要确保这段代码在任何时候都可以安全中止(不会被破坏 - 例如,我不知道从字典中读取时会发生什么......)。
所以不得不提一下threadIdMap是Dictionary(int,ManualResetEvent),而锁定对象是ManualResetEvent的实例。
我希望你现在能理解我的问题。对不起它的大。