- 1
- 2
- 3
- 4
try {} finally {
retVal = NativeMethods.CreateProcess ( /* ... */ );
/* ... и дальше остальной код... */
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+111
try {} finally {
retVal = NativeMethods.CreateProcess ( /* ... */ );
/* ... и дальше остальной код... */
}
Откопано в исходниках .NET 2.0 Framework, так реализуется Process.Start. Не очень понял замысла. Нашёл, что finally обязательно продолжит исполняться, если во время его исполнения на поток ВНЕЗАПНО вызван метод Abort. Т.е. если потоку, создающему процесс, сделать аборт, процесс всё равно упорно создаcтся и запустится (чистки памяти я не нашёл). В чём смысл? Так можно было бы тогда всякий код оборачивать в finally... Ящитаю, что это всё костыли вокруг говноархитектуры. Не зря в Яве Thread.stop сделали deprecated. А вы как считаете?
А нельзя :(
С адресом http://govnokod.ru/comments/2837/rss
кстати, уберите, пожалуйста аватарку, похожую на аватарку гвеста, не путайте людей. спасибо
там говноэффект:
"Ошибка
запрошенный виртуальный сервер не существует или перегружен"
Страница проекта на google.code
http://code.google.com/p/govnokod/
Надо будет прикрепить в топ лучшего говнокода :)
Возможности прервать CreateProcess нет, а значит - процесс должен быть создан до конца.
Ферштейн, инженер с однолетним стажем? :)
MS и так уже имеет проблемы с тем, что поток, который крутится в CER-регионе в вечном цикле, сбросить, не повредив CLR вообще нельзя. Потому что в отличие от жабы, где все крутится под жесткой виртуальной машиной, защищенной 10 слоями абстракций, CLR гораздо глубже интегрирована в родительскую ось, и многие вещи в ней являются просто гейтами к unmanaged underlayer.
У CLR должна быть возможность всегда сбросить тот или иной поток, в случае закрытия приложения (что не так важно, там можно работать на низком уровне) или выгрузки домена. Последнее - очень важно, так как домены - это изобретение .NET Framework и ось о них ничего не знает.
> виртуальной машиной, защищенной 10 слоями абстракций, CLR
> гораздо глубже интегрирована в родительскую ось, и многие вещи в
> ней являются просто гейтами к unmanaged underlayer.
Это заблуждение, виртуальная машина нета - такая, же как у жабы. Просто у нета более прозрачный для программиста способ обращаться к системе (PInvoke). И всё зависит от конкретной платформы, CLR под винду - да, простые гейты, но с точки зрения спецификации "чудная" корреляция между поведением винды и CLR - просто "совпадение". Это особо ни на что не влияет, просто _такая_ логика системы. Логика жабы может быть более понятна линуксу, но мене понятна винде. И? Тьюринг-полная машина может какую- угодно логику переваривать. Под моной, например, под Линукс, сделан слой win-io-layer. И?
Вот с доменами может быть, да, я там особо не курил :) В любом случае, вырубать поток на полпути должно быть только крайней мерой, это, имхо, всё равно говноархитектура.
И, разумеется, претензий не было бы, если бы Майкрософт не называло своё детище "кросплатформенным фреймворком". Если бы назвали что-то типа "com+ 2.0" - был бы другой разговор.
Кроме того, CLR организует еще один уровень абстракции и защищает программиста от его собственной глупости (например, от вечного цикла в непрерываемом потоке, хотя, я кажется, об этом уже писал). Защитные абстракции - это последняя брешь обороны в сложном коде. В принципе, никто не мешает не использовать ООП, например, а использовать структуры и процедуры, принимающие их на обработку, однако инкапсуляция помогает выдерживать собственные ограничения.
Вырубать поток на полпути - действительно, крайняя мера. CLR поступает так в очень редких случаях, и среднестатистический программист на C# никогда не слышал о ThreadAbortException. Однако, в корневой библиотеке нельзя забывать о мелочах.