2012-05-16 7 views
5

Estoy trabajando en la aplicación de varias instancias. ¿Hay alguna forma en C# de saber cuántas instancias se están ejecutando actualmente?
Utilicé un pedacito de código para contar los procesos de ventana de mi nombre de aplicación, pero esa no es una buena manera.implementación de semáforos para contar núm. de instancias actualmente en ejecución

string fileName = Process.GetCurrentProcess().MainModule.FileName; 
int count = 0; 
foreach (Process p in Process.GetProcesses()) 
{ 
    try 
    { 
     if (p.MainModule.FileName == fileName) 
     { 
      count++; 
     } 
    } 
    catch { } 
} 

MessageBox.Show("Total Instances Running are " + count); 


¿Se puede hacer mediante el uso de semáforo o algún incremento y decremento de contador que se incrementa en uno cuando se crea y decremento nueva instancia por uno cuando una instancia se cierra.

Respuesta

1

A Semaphore le ayuda a contar hacia atrás, lo que le bloquea cuando llega a 0. Podría utilizar un semáforo global, pero tendrá que inicializarlo a un valor lo suficientemente alto y comenzar a contar hacia abajo.

Creo que en general, su propia solución es probablemente la más limpia.

+0

gracias por la respuesta. ¿Pueden decirme algunos otros recursos excepto msdn? –

+0

Google? https://www.google.co.il/search?q=.net+semaphore&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a – zmbq

+0

El problema con el semáforo clase es que no se puede obtener el conteo sin liberarlo, lo que puede producir un código bastante complicado ... –

1

¿Por qué no utiliza la memoria compartida? Por supuesto, debe protegerlo con un mutex visible para todos los procesos, pero de esta manera puede almacenar datos de uso común entre todos los procesos.

Supongo que tiene que P/Invocar la rutina de la plataforma es para crear una memoria compartida, pero es muy sencillo.

1

La gestión de procesos múltiples nunca es un problema. El sistema operativo pone una gran pared entre ellos que hace que casi cualquier cosa sea difícil y costosa. El código que está utilizando no es una excepción, la iteración de procesos en ejecución es costosa. Siempre considere primero usar hilos en su lugar y busque AppDomains en un programa .NET, una característica expresamente inventada para proporcionar el tipo de aislamiento que un proceso puede proporcionar, pero sin el costo de matar la barrera de interoperabilidad.

Si está comprometido con una solución multiproceso, casi siempre necesitará un proceso separado que actúe como árbitro. Responsable de garantizar que los procesos de trabajo comiencen y hagan algo significativo cuando uno de ellos muere por una excepción no controlada. Lo cual es algo que es muy difícil de manejar, ya que no hay una buena forma de obtener información sobre el motivo por el que murió y se pierde una gran cantidad de estado. El resultado típico es un mal funcionamiento de toda la aplicación a menos que le proporcione a estos procesos cosas muy simples para hacer que puede prescindir fácilmente.

Este proceso de arbitraje no tiene problemas para contar instancias de forma económica, puede usar el evento Process.Exited para mantener un contador. Un evento en lugar de tener que sondear.

Cuestiones relacionadas