Здравствуйте, DarkEld3r, Вы писали:
DE>Я так понимаю, что подробностей и примеров граблей не будет?..
А какие именно подробности тебе нужны? Незакрытых файлов, не освобождённых объектов синхронизации и инконсистентного состояния программы не достаточно? По-моему вполне. Потоки убивать нельзя!
Ф>>ЗЫ: точно такие же идиоты в шарпе https://learn.microsoft.com/ru-ru/dotnet/api/system.threading.thread.abort?view=net-7.0
DE>В чём суть претензии? В наличии этого метода в принципе или в том, что аборт можно перехватить?
Странно, что ты только про этот метод спросил, а вот про TerminateThread() умолчал. Претензия в том, что эта дрянь может кинуть исключение там, где его изначально в принципе не предполагалось, а то что оно может прервать статический конструктор и прервать инициализацию статических полей класса — это дикий трэш. Просто представь себе, что у тебя инициализируется глобальный экземпляр какой-нибудь сложной хрени, и в этот момент прилетает ThreadAbort — всё, приплыли: ты потом в жизни не разберёшься почему программа погоду на Марсе добывает вместо того чтобы работать.
Там кроме того что ты можешь написать на эту тему в самой BCL попадается, например:
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
Если ResourceManager инициализировался наполовину, то программа корректно уже не будет работать.