Recientemente estoy trabajando en una ConsoleApp para la programación de trabajos. Este artículo no discutirá la parte de programación de trabajos por ahora (escribiré sobre esto más adelante).
Requisitos de ejecución de ConsoleApp
1. Inicie la aplicación cuando se inicie el sistema;
2. Instancia única ejecutándose en cada sesión;
Al abrir un enlace de escritorio remoto, solo se permite iniciar una instancia de ConsoleApp.
3. Sólo se puede ejecutar una instancia dentro del sistema;
Cuando se abren varios enlaces de escritorio remoto, solo se permite iniciar una instancia de ConsoleApp.
exclusión mutua
Mutex: una primitiva de sincronización que también se puede utilizar para la sincronización entre procesos.
MSND visible: http://msdn.microsoft.com/zh-cn/library/system.threading.mutex.aspx
En la introducción del documento oficial, hay este párrafo.
En un servidor que ejecuta Terminal Services, un sistema mutex con nombre puede tener dos niveles de visibilidad. Si el nombre comienza con el prefijo "Global", el mutex es visible en todas las sesiones del servidor terminal. Si el nombre comienza con el prefijo "Local", el mutex sólo es visible en la sesión del servidor terminal en la que se creó. En este caso, puede tener un mutex separado con el mismo nombre en cada otra sesión del servidor de terminal en el servidor. Si se crea un mutex con nombre sin especificar un prefijo, tomará el prefijo "Local". En una sesión de servidor de terminal, dos exclusión mutua que difieren sólo en su prefijo de nombre son exclusión mutua independientes y estas dos exclusión mutua son visibles para todos los procesos en la sesión de servidor de terminal. Es decir: los nombres de prefijo "Global" y "Local" indican el alcance del nombre mutex en relación con la sesión del servidor terminal (no en relación con el proceso).
Desafortunadamente, no se encontró ningún ejemplo de C#. Este pasaje puede entenderse como:
mutexName= "Local\" +"AppName";
Sólo es válido para la sesión en la que se creó, lo que significa que cuando se abra una nueva conexión remota, se iniciará nuevamente la instancia de ConsoleApp.
mutexName= "Global\" +"AppName";
Válido para todas las sesiones Cuando se abren varios enlaces remotos, solo el primer enlace remoto iniciará correctamente la instancia de ConsoleApp.
Ejecutar como una única instancia por sesión
vacío estático privado LocalMutex()
{
// Si se debe crear mutex por primera vez
bool newMutexCreated = falso;
string mutexName = "Local\" + "tenghoo";
Mutex mutex = nulo;
intentar
{
mutex = new Mutex(false, mutexName, out newMutexCreated);
}
captura (Excepción ex)
{
Consola.Escribir(ex.Mensaje);
Sistema.Threading.Thread.Sleep(3000);
Entorno.Salir(1);
}
// Crea mutex por primera vez
si (nuevoMutexCreado)
{
Console.WriteLine("El programa se ha iniciado");
//todo: Aquí está la tarea a realizar
}
demás
{
Console.Write("Ya se está ejecutando otra ventana y se cerrará automáticamente después de 3 segundos...");
Sistema.Threading.Thread.Sleep(1000);
Consola.Write("1");
Sistema.Threading.Thread.Sleep(1000);
Consola.Write("2");
Sistema.Threading.Thread.Sleep(1000);
Consola.Write("3");
Environment.Exit(1);//Salir del programa
}
}
Operación de instancia única en todo el sistema
vacío estático privado GlobalMutex()
{
// Si se debe crear mutex por primera vez
bool newMutexCreated = falso;
string mutexName = "Global\" + "tenghoo";
Mutex mutex = nulo;
intentar
{
mutex = new Mutex(false, mutexName, out newMutexCreated);
}
captura (Excepción ex)
{
Consola.Escribir(ex.Mensaje);
Sistema.Threading.Thread.Sleep(3000);
Entorno.Salir(1);
}
// Crea mutex por primera vez
si (nuevoMutexCreado)
{
Console.WriteLine("El programa se ha iniciado");
//todo: Aquí está la tarea a realizar
}
demás
{
Console.Write("Ya se está ejecutando otra ventana y se cerrará automáticamente después de 3 segundos...");
Sistema.Threading.Thread.Sleep(1000);
Consola.Write("1");
Sistema.Threading.Thread.Sleep(1000);
Consola.Write("2");
Sistema.Threading.Thread.Sleep(1000);
Consola.Write("3");
Environment.Exit(1);//Salir del programa
}