Идентификатор рабочего потока, который вы видите, равен 0. Это фреймворковый поток, и он ожидается - это не тот поток, который программа "породила".Если вы присоединитесь к любому процессу .Net, вы увидите это.Я не уверен, какой это фреймворковый поток - определенно это не поток финализатора, поскольку он никогда не является потоком 0. Возможно, поток JIT?
Что более интересно, чем ваш основной поток, так как кажется, что он зависает,Я бы сконцентрировался на отладке вашего основного потока, чтобы закончить это.Блокируется ли он из обработчика событий закрытия окна, ожидая чего-то, что никогда не произойдет, например?
Обновление
После чтения трассировки стека для основного потока, добавленного ввопрос, было бы интересно запустить тест, чтобы выяснить, не остановился ли основной поток или он просто проста, ожидая сообщения (и ожидает ли он WM_CLOSE, который он никогда не получал или никогда не отправлял).
Приведенный ниже код можно использовать для ручной отправки сообщения WM_CLOSE в ваше приложение.Просто подождите, пока ваша программа зависнет, когда вы выключите ее, а затем запустите код.Замените имя процесса своим собственным.
Обновление 2
Хорошо, похоже, что основной поток хорошо и действительно завис, поскольку он не обрабатывает сообщения WM_CLOSE или WM_QUIT..
Попробуйте создать наименьшее приложение, способное воспроизвести проблему, и опубликовать код.
Пример WM_CLOSE \ WM_QUIT App
internal class Program
{
private const int WM_QUIT = 0x0012;
private const int WM_CLOSE = 0x0010;
[DllImport("user32.dll")]
private static extern bool PostMessage(int hhwnd, uint msg, IntPtr wParam, IntPtr lParam);
private static void Main()
{
Process p = GetProcess("Your process name - no '.exe' required");
CloseMainWindow(p);
}
private static Process GetProcess(string name)
{
List<Process> processes = Process.GetProcessesByName(name).ToList();
if (processes.Count != 1)
{
throw new Exception(
"Expected 1 process with name '" + name +
"' but found " + processes.Count + ".");
}
return processes[0];
}
private static void CloseMainWindow(Process p)
{
PostMessage(p, WM_CLOSE, "close");
}
private static void QuitApplication(Process p)
{
PostMessage(p, WM_QUIT, "quit");
}
private static void PostMessage(Process p, uint message, string name)
{
Console.WriteLine("Posting {0} message to '{1}'...", name, p.ProcessName);
bool succeeded = PostMessage(p.MainWindowHandle.ToInt32(), message, IntPtr.Zero, IntPtr.Zero);
Console.WriteLine("Posted {0} message to '{1}' (succeeded:{2}).", name, p.ProcessName, succeeded);
}
}