Ответ 1
Если вы используете .NET-приложение, я считаю, что вы всегда получаете поток (в основном спальный) для JIT (компилятор Just-in-Time), а также поток GC (Garbage Collection), в дополнение к вашему основной поток.
Я создал консольное приложение в С# с одним оператором Console.ReadLine
. Запуск этого приложения в Visual Studio и переход в отладчик показывают 7 потоков в окне потока (6 рабочих потоков, один -.NET SystemEvents, а другой - vshost.RunParkingWindow
и основной поток).
Когда я запускаю приложение за пределами Visual Studio, я вижу в общей сложности 3 потока в диспетчере задач Windows. Почему так много, когда я ожидал бы 1 нить? Для чего другие порождаются?
Если вы используете .NET-приложение, я считаю, что вы всегда получаете поток (в основном спальный) для JIT (компилятор Just-in-Time), а также поток GC (Garbage Collection), в дополнение к вашему основной поток.
Вам не нужно беспокоиться: если вы не используете их явно, у вас не будет никакого кода, работающего в другом потоке, кроме основного потока. Другие потоки предназначены для:
Разделяют ли 3 потока один stdin?
Теоретически да, но другие не будут использовать его, если вы не используете Console.ReadLine внутри деструктора или внутри ThreadPool.QueueUserWorkItem, так что не волнуйтесь, вы получите все данные в основном потоке
Есть способ переместить 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;
}));
}
Не забывайте, что поток финализатора!
Если вы не выполнили ни одной операции с потоком или потоком, то только один из этих потоков будет вашим. Остальные создаются средой выполнения и ее библиотеками, например. вывоз мусора. Количество потоков будет варьироваться в зависимости от используемых вами библиотек, количества ядер и т.д.
Эти потоки могут совместно использовать контекст, например. Консоль, но вам нужно только беспокоиться о синхронизации ваших собственных потоков и конструкций.