Маленькое вступление:
В сложных многопоточных приложениях (корпоративная сервисная шина ESB) мне нужно использовать Thread.Abort, потому что этот ESB принимает написанные пользователем модули, которые взаимодействуют с аппаратными модулями безопасности. Поэтому, если этот модуль блокируется или аппаратное обеспечение перестает отвечать на запросы - мне нужно просто выгрузить этот модуль, а оставшаяся часть этого сервера приложений должна оставаться запущенной.
Таким образом, существует механизм прерывания синхронизации, который гарантирует, что код может быть прерван только в пользовательском разделе, и этот раздел должен быть помечен как AbortAble. Если это произойдет (прервется), существует вероятность того, что ThreadAbortException будет выброшено в этот фрагмент кода:
public void StopAbortSection()
{
var id = Thread.CurrentThread.ManagedThreadId;
lock (threadIdMap[id])
{
....
}
}
Например, модуль находится в AbortSection (введен путем вызова аналогичного метода StartAbortSection), и ServerAplication решает прервать пользовательский модуль, но после этого решения, но до фактического Thread.Abort, модуль входит в NonAbortableSection, вызывая этот метод, но блокировка фактически выполняется этот объект блокировки.
Таким образом, блокировка будет блокироваться до тех пор, пока не будет выполнен Abort, но прерывание может быть выполнено и до достижения этого блока в этом коде Но Object с этим методом важен, и мне нужно быть уверенным, что этот фрагмент кода безопасен для прерывания в любой момент (не повреждается - например, я не знаю, что происходит при чтении из Dictionary ..).
Поэтому я должен упомянуть, что threadIdMap - это Словарь (int, ManualResetEvent), а объект блокировки - это экземпляр ManualResetEvent.
Надеюсь, теперь вы поняли мой вопрос. Извините за его величие.