Подтвердить что ты не робот

Почему 3 потока для простого однопоточного консольного приложения С#?

Я создал консольное приложение в С# с одним оператором Console.ReadLine. Запуск этого приложения в Visual Studio и переход в отладчик показывают 7 потоков в окне потока (6 рабочих потоков, один -.NET SystemEvents, а другой - vshost.RunParkingWindow и основной поток).

Когда я запускаю приложение за пределами Visual Studio, я вижу в общей сложности 3 потока в диспетчере задач Windows. Почему так много, когда я ожидал бы 1 нить? Для чего другие порождаются?

4b9b3361

Ответ 1

Если вы используете .NET-приложение, я считаю, что вы всегда получаете поток (в основном спальный) для JIT (компилятор Just-in-Time), а также поток GC (Garbage Collection), в дополнение к вашему основной поток.

Ответ 2

Вам не нужно беспокоиться: если вы не используете их явно, у вас не будет никакого кода, работающего в другом потоке, кроме основного потока. Другие потоки предназначены для:

  • Сборщик мусора
  • Финализация
  • Threadpool

Разделяют ли 3 потока один stdin?

Теоретически да, но другие не будут использовать его, если вы не используете Console.ReadLine внутри деструктора или внутри ThreadPool.QueueUserWorkItem, так что не волнуйтесь, вы получите все данные в основном потоке

Ответ 3

Есть способ переместить SystemEvents notifier в ваш поток:

public static class ThreadingHelper_NativeMethods
{
   [DllImport("user32.dll")]
   public static extern bool IsGUIThread(bool bConvert);
}


     // This code forces initialization of .NET BroadcastEventWindow to the UI thread.
     // http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/fb267827-1765-4bd9-ae2f-0abbd5a2ae22
     if (ThreadingHelper_NativeMethods.IsGUIThread(false))
     {
        Microsoft.Win32.SystemEvents.InvokeOnEventsThread(new MethodInvoker(delegate()
        {
           int x = 0;
        }));
     }

Ответ 4

Не забывайте, что поток финализатора!

Ответ 5

Если вы не выполнили ни одной операции с потоком или потоком, то только один из этих потоков будет вашим. Остальные создаются средой выполнения и ее библиотеками, например. вывоз мусора. Количество потоков будет варьироваться в зависимости от используемых вами библиотек, количества ядер и т.д.

Эти потоки могут совместно использовать контекст, например. Консоль, но вам нужно только беспокоиться о синхронизации ваших собственных потоков и конструкций.