c# - studio - programacion en consola
¿Por qué 3 hilos para una aplicación básica de consola c#única? (5)
¡No olvides ese hilo de finalizador!
Creé una aplicación de consola en c # con una sola instrucción Console.ReadLine
. Al ejecutar esta aplicación en Visual Studio y acceder al depurador se muestran 7 subprocesos en la ventana de subprocesos (6 subprocesos de trabajo, uno es .NET SystemEvents y el otro es vshost.RunParkingWindow
y el subproceso principal).
Cuando ejecuto la aplicación fuera de Visual Studio, veo un total de 3 subprocesos en el administrador de tareas de Windows. ¿Por qué tantos cuando esperaba 1 hilo? ¿Para qué están siendo engendrados los otros?
Hay una forma de mover el notificador SystemEvents a su hilo:
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;
}));
}
No necesita preocuparse: si no los usa explícitamente, no ejecutará ningún código en otro hilo que no sea el hilo principal. Los otros hilos son para:
- Recolector de basura
- Finalización
- Threadpool
¿Los 3 hilos comparten un stdin?
Teóricamente sí, pero los demás no lo usarán a menos que use Console.ReadLine dentro de un destructor o dentro de ThreadPool.QueueUserWorkItem, así que no se preocupe, obtendrá todos los datos en el hilo principal
Si no has hecho ningún trabajo de subprocesamiento o subprocesos, solo uno de esos subprocesos es tuyo. El resto son creados por el tiempo de ejecución y sus bibliotecas, por ejemplo, recolección de basura. La cantidad de hilos variará según las bibliotecas que use, el número de núcleos, etc.
Esos hilos pueden compartir el contexto, por ejemplo, la consola, pero solo debe preocuparse por sincronizar sus propios hilos y construcciones.
Si está ejecutando una aplicación .NET, creo que siempre obtiene un hilo (principalmente durmiente) para el hilo JIT (compilador Just-in-Time), así como el hilo GC (Garbage Collection), además de su hilo principal.