2008-11-19 18 views
5

Estoy codificando una función en un programa donde los usuarios pueden editar documentos almacenados en una base de datos, guarda el documento en una carpeta temporal y luego utiliza Process.Start para iniciar el documento en la aplicación de edición, digamos Microsoft Word, por ejemplo.C# Process.Start, cómo evitar la reutilización de la aplicación existente?

Luego mi aplicación necesita esperar hasta que hayan cerrado el proceso llamado y reemplazar el documento en la base de datos con la copia recién editada en la carpeta temporal.

el siguiente código funciona muy bien siempre y cuando la llamada aplicación no se está ejecutando:

ProcessStartInfo pInfo = new ProcessStartInfo(); 
pInfo.FileName=TempFolder + Path.DirectorySeparatorChar + f.Name; 
Process p = new Process(); 
p.StartInfo = pInfo; 
p.Start(); 
//p is null at this point if called application was already running 
//i.e. Microsoft Word is re-used instead of starting a fresh copy 
p.WaitForInputIdle(); 
p.WaitForExit(); 

¿Hay una manera de fuerza iniciar un proceso totalmente nuevo o cualquiera puede pensar en otra forma de manejar esta. Realmente no quiero que los usuarios puedan hacer nada más en mi aplicación hasta que hayan cerrado el proceso llamado porque necesito saber si editaron ese archivo o no en ese momento, no después, cuando todo tipo de otros problemas podrían surgir.

+0

Las etiquetas editadas son más generalizadas, por lo que la pregunta se ve en más feeds. –

Respuesta

0

Después de investigar más y encontrar una serie de publicaciones que mencionan la falta de fiabilidad de WaitForExit y el evento 'Exited del proceso, he encontrado una solución completamente diferente: comienzo el proceso y no me molesto en esperarlo, simplemente abra un cuadro de diálogo modal en el que el usuario puede hacer clic en actualizar para actualizar el archivo de la carpeta temporal nuevamente en la base de datos cuando haya editado y guardado el archivo temporal o cancelado.

De esta manera está en sus manos y no tengo que depender de los caprichos de Process.Start.

Gracias por la ayuda de todos.

0

no estoy seguro sobre el iniciar un nuevo proceso, pero ¿ha considerado esta lógica para esperar hasta la salida:

tiempo (Process.IsRunning) {}

básicamente sólo un bucle hasta que su titular proceso está hecho.

+1

El proceso es nulo inmediatamente después de iniciar la llamada si reutiliza una aplicación existente. – JohnC

0

Sí, suscríbase al proceso 'Exited event' y establezca la propiedad process.EnableRisingEvents en true. ¡Entonces haga que su aplicación no haga nada hasta que se active el evento Exited!

Y sobre forzar el uso de un nuevo proceso, creo que es el comportamiento predeterminado, creo que depende del proceso que está llamando si permite que más de una instancia se ejecute al mismo tiempo o no, que está fuera de tu control ... desafortunadamente.

¡Buena suerte!

+0

Desafortunadamente dos prolemas: el proceso es nulo inmediatamente después de iniciar la llamada si se reutiliza y si ya tienen la aplicación abierta para otro documento, estoy bloqueado hasta que también cierren eso. – JohnC

+0

Hmmm ... ha intentado deshacerse de las dos últimas líneas: p.WaitForInputIdle(); p.WaitForExit(); ? Luego, suscríbase a Exited y establezca EnableRisingEvents en true antes de llamar a start() –

0

Creo que estás utilizando el método incorrecto para resolver el problema. Si solo está tratando con documentos Word, creo que debería usar la interoperabilidad COM para palabras de palabra y control desde su aplicación. Con COM puede controlar todo en word, podrá abrir el documento en word y sabrá cuándo lo cerró el usuario.

+0

No, no son solo documentos de Word, solo un ejemplo, podría ser * cualquier * tipo de archivo. – JohnC

2

Personalmente no estoy seguro de estar de acuerdo con este enfoque en absoluto. Mostrar un formulario modal puede sacarlo de esta situación, pero en la mayoría de los casos cuando una solución parece difícil de encontrar, es útil cambiar el problema que está tratando de resolver.

Opción 1:

En este caso, me gustaría recomendar un modelo de pago/registro.Esto permitiría a los usuarios "verificar" un archivo en su máquina, y luego registrarlo cuando hayan terminado de actualizarlo. Esto tiene una serie de ventajas:

  • Pueden editar muchos documentos a la vez y realizar operaciones de registro en varios documentos a la vez.
  • Pueden aplicar comentarios a checkins.
  • El usuario puede apagar su PC o desconectarse y seguir trabajando en su documento.
  • El usuario puede verificar varios documentos localmente y luego llevar el trabajo a casa.
  • No tiene que intentar averiguar qué hacer si la PC falla (o se agota la batería de la computadora portátil) mientras hay un documento abierto y cómo volver a armarlo.

El modelo también encaja bien con el concepto de crear un nuevo documento y agregarlo a la base de datos. Es lo mismo que un checkin.

Puede proporcionar fácilmente informes que muestren quién tiene qué documento desprotegido y cuál es su ubicación de "copia de trabajo".

Reconozco que, por lo general, solo los desarrolladores se sienten cómodos con este modelo y es posible que deba invertir en una pequeña cantidad de entrenamiento. No creo que sea difícil configurar un sistema de recordatorio automático que envíe correos electrónicos a las personas cuando se les haya retirado un documento durante mucho tiempo.

Opción 2:

Vea el archivo utilizando un FileSystemWatcher o equivalente. Esto le permitiría controlar el archivo, y cuando el usuario realiza una operación de guardado, puede comprometerse con la base de datos. Después de todo, es solo si el usuario realmente guardó el archivo que le interesa actualizar la base de datos,

+0

La opción uno es una gran idea y será útil para otros que se encuentren con esto; si la gestión de documentos era el punto central de la aplicación. Me gustaría ir por esa ruta, pero esta es una característica secundaria y el diálogo modal es a la vez simple y a prueba de balas, dos cosas que me gustan en el software que tengo que soportar. :) – JohnC

+0

Opción dos: sería muy cauteloso con el uso, lo consideré pero me encontré con muchos mensajes en línea sobre problemas con él e incluso sus propios documentos mencionan numerosos problemas potenciales con la longitud del búfer y los nombres de archivo largos, etc. Demasiado frágil Pienso para mis propósitos, pero podría ser útil para otros. – JohnC

Cuestiones relacionadas