C# Environment.Exit(0) leaves main thread to hang on Windows 10

blanko27
Уже с Приветом
Posts: 2261
Joined: 17 Jun 2003 04:41
Location: Just like US

C# Environment.Exit(0) leaves main thread to hang on Windows 10

Post by blanko27 »

Кто нибудь встречал такое чудо? Происходит только на Windows 10, как под дебагером, так и без. Причем дебагер не позволяет pause процесс и посмотреть стек, stop process в Visual Studio вызывает зависание оной, пока хост процесс не прибит снаружи насильно. Также невозможно подцепится WinDbg или adplus (говорят - нет такого процесса). PerfMon показывает, что остается единственный main thread который спит. Единственно возможной опцией захватить стек был последняя версия SystemInternals ProcExp, который показал, что процесс ожидает чего-то в кернеле. :?

Image
...а мы такой компанией, возьмем, да и припремся к Элис!
blanko27
Уже с Приветом
Posts: 2261
Joined: 17 Jun 2003 04:41
Location: Just like US

Re: C# Environment.Exit(0) leaves main thread to hang on Windows 10

Post by blanko27 »

Забыл добавить, что Environment.Exit(0) вызывается в конце Main(), после того, как custom ApplicatioContext закончил бежать.
Нечто вроде:

Code: Select all

[STAThread]
static void Main(string[] args) {
    MyApplicationContext context = new MyApplicationContext(typeof(frmMain));
    Application.Run(context);
    Environment.Exit(0);
}
...а мы такой компанией, возьмем, да и припремся к Элис!
blanko27
Уже с Приветом
Posts: 2261
Joined: 17 Jun 2003 04:41
Location: Just like US

Re: C# Environment.Exit(0) leaves main thread to hang on Windows 10

Post by blanko27 »

На самом деле, если даже Environment.Exit(0) убрать, то программа виснет в том же месте и только на Windows 10, на Windows 7 заканчивается без проблем.
.NET Framework 4.5.2, если это имеет значение.
...а мы такой компанией, возьмем, да и припремся к Элис!
blanko27
Уже с Приветом
Posts: 2261
Joined: 17 Jun 2003 04:41
Location: Just like US

Re: C# Environment.Exit(0) leaves main thread to hang on Windows 10

Post by blanko27 »

Вот это:

Code: Select all

[STAThread]
static void Main(string[] args) {
    MyApplicationContext context = new MyApplicationContext(typeof(frmMain));
    Application.Run(context);
    if (isWindows10()) {
        System.Diagnostics.Process.GetCurrentProcess().Kill(); // <--- magic Environment.Exit(-1)
    }
}
мне ужасно помогло. Одно только не пойму, почему для Windows 10 я должен это добавлять :?
...а мы такой компанией, возьмем, да и припремся к Элис!

Return to “Вопросы и новости IT”