Почему 3 потока для основного однопоточного консольного приложения c #? - PullRequest
19 голосов
/ 18 апреля 2009

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

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

Ответы [ 5 ]

36 голосов
/ 18 апреля 2009

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

5 голосов
/ 21 января 2011

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

  • Сборщик мусора
  • Завершение
  • Threadpool

3 потока имеют общий STDIN?

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

3 голосов
/ 28 апреля 2009

Существует способ переместить уведомитель SystemEvents в ваш поток:

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;
        }));
     }
1 голос
/ 21 января 2011

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

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

1 голос
/ 18 апреля 2009

Не забудьте эту ветку финализатора!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...