2012-05-08 8 views
9

Estoy escribiendo una aplicación que tendrá la opción de ejecutarse en el Inicio de Windows.C# - ¿Cómo saber cuándo Windows está "resuelto" después del inicio?

No soporto cuando las aplicaciones empantanan mi PC antes de que se haya asentado realmente, y esta es una aplicación no crítica. Me gustaría que mi aplicación esperara amablemente a que todos los demás elementos de inicio terminen y se establezcan para que la PC del usuario responda antes de que empiece a hacer cualquier trabajo.

¿Qué debo hacer para detectar esta condición? Supongo que podría atravesar el registro y buscar todos los procesos de inicio para ejecutar, o usar un temporizador de larga duración. Solo espero que haya otro truco menos hackish que pueda usar.

EDITAR: La aplicación tiene una IU y no se puede ejecutar como un servicio. Tiene un modo de bandeja. Hace algo de renderizado de imágenes.

+1

[Este artículo] (http://blogs.msdn.com/b/oldnewthing/archive/2005/03/11/394249.aspx) podría ser de su interés – Vlad

+2

No hay una señal específica para esto. Supongo que podría probar los contadores de rendimiento para la carga de la CPU y las transferencias de disco. –

+0

Bien, tuve que agregar el siguiente comentario: NUNCA crearía una aplicación que se ejecute de manera predeterminada al inicio. Tienes que establecer eso explícitamente. Si haces eso en tu aplicación, y no hay una persona de negocios que diga que te despedirán si no lo haces, ¡eres una mala persona! –

Respuesta

4

Un temporizador 'largo' es la mejor ruta. No tocaría el registro con un bargepole.

Sin embargo, una cosa que querrás considerar es ¿qué sucede si un usuario quiere iniciar tu programa por sí mismo? Obviamente, no querrás estar causando el retraso entonces.

Supongo que su aplicación tiene una IU? Si no es así, usted podría considerar un servicio con su tipo de inicio en "Automático (retardado)" en Vista/7

Por favor, vea también esta pregunta relacionada: How to create delay startup application in c#?

Un último punto, si el programa es no- crítico, y le preocupa que pueda ralentizar las cosas, considere disminuir la prioridad de la aplicación.

+1

Respuesta aceptada por minuciosidad. Creo que terminaré esperando que el uso de la CPU se establezca y luego use un hilo con la prioridad más baja posible y permita que esa prioridad sea configurable. También puedo agradecer su comentario sobre el registro. sido un último recurso: <) –

2

Parece que este es el tipo de cosa mejor en manos del usuario, y Windows ya ofrece una buena opción para controlar esto, al menos para los Servicios de Windows.

Si esto es un servicio de Windows, el servicio puede ser configurado para iniciar automática (inicio retardado)

Tal vez esa es la mejor opción?

Si no desea seguir esa ruta, o si su programa no es un servicio de Windows, detectar cuándo se "resuelve" Windows es bastante subjetivo y propenso a errores. Puede supervisar Disk IO como un indicador algo confiable. El disco IO suele ser el cuello de botella durante el inicio (especialmente para sistemas sin unidades SSD OS). Es posible que obtenga una aproximación razonable de "liquidez" a la espera de que el disco IO (según lo indicado por los contadores de rendimiento) caiga por debajo de un cierto umbral. No querrá esperar más de una cantidad de tiempo configurable y luego comenzar de todos modos, porque algunos sistemas pueden arrancar y comenzar a realizar tareas no relacionadas y de larga ejecución que gravan el subsistema IO.

+0

Este es también un excelente enfoque. Concitalmente terminé usando una combinación de sondeo de disco IO, sondeo de uso de CPU y un tiempo máximo de espera. –

1

dos sugerencias:

  1. utilizar un hilo de baja prioridad para hacer su trabajo. Después de todo, es una prioridad baja, ¿verdad? Esto solo tiene una buena posibilidad de minimizar con éxito el impacto de la puesta en marcha.
  2. Si realmente quiere esperar a que las cosas se solucionen, simplemente verifique la utilización de la memoria del procesador & en lugar de hacer toda la lectura del registro o esperar una cantidad arbitraria de tiempo. Instrucciones sobre eso están aquí: How to get the CPU Usage in C#?

¡Buena suerte!

1

Bastante tarde (por cuatro años) a la fiesta aquí, pero en caso de que alguien más se tropiece con esta Q & A como yo lo hice ... pedí un similar question pero mi atención se centró en saber cuándo las cosas se calman antes de que el usuario registre -en. Entiendo que la aplicación de OP se ejecuta desde el escritorio y tiene elementos de UI, etc. Pero si revisas ese hilo verás que hay una manera de saber si Windows ha terminado de cargar los servicios. Por lo tanto, un servicio puede ejecutarse al inicio, borrar un indicador de "hecho", esperar a que se inicien los servicios y luego establecer ese indicador. Ahora, cuando el usuario inicie sesión, si el sistema todavía está en pleno ascenso, la aplicación sabrá y no se apresurará a inicializar la interfaz de usuario. Si se establece el indicador "hecho", la interfaz de usuario puede "sentirse cómodo" al comenzar con el conocimiento de que la mayoría o todas las demás aplicaciones han hecho lo suyo. Es posible que el usuario inicie otra aplicación después de iniciar sesión. Por lo tanto, se establecerá la bandera hecha, pero las cosas podrían estar sucediendo. Este es el lugar donde otras comprobaciones sugeridas, como el uso de la CPU, serían valiosas.

Cuestiones relacionadas