5

estoy despliegue de una aplicación C# utilizando el asistente de configuración del proyecto en Visual Studio 2008.Vista Programación de tareas de configuración De

¿Cuál es la forma más sencilla para mí tener de Windows programar mi aplicación se ejecute a intervalos regulares (por ejemplo, cada 8 horas)? Prefiero que esta programación ocurra durante la instalación de la aplicación para simplificar la configuración para el usuario final.

Gracias!

Respuesta

0

Tarea programada es su camino a seguir. Eche un vistazo a esta página para saber cómo configurar la tarea con un script.

+0

Luego tendría que adjuntar ese script con el instalador y tener cuidado de eliminarlo después de programar el otro programa para que se ejecute. ¿No hay una buena manera de que el Asistente de configuración haga esto por mí? – mrduclaw

+0

puede hacer cualquier cosa en el componente de configuración que pueda hacer en el script. – rerun

10

Esto me llevó algo de trabajo, así que aquí hay documentación completa para programar una tarea desde un proyecto de instalación.

Una vez que haya creado su proyecto de implementación, necesitará usar Custom Actions para programar la tarea. Walkthrough: Creating a Custom Action

Nota: El tutorial le pide que agregue la salida principal al nodo de instalar, incluso si usted no planea en hacer cualquier cosa costumbre durante el paso Instalar. Esto es importante, así que no lo ignore como lo hice. La clase de instalador realiza cierta gestión de estado durante este paso y debe ejecutarse.

El siguiente paso es pasar el directorio de instalación a la acción personalizada. Esto se hace a través del CustomActionData property. Ingresé /DIR="[TARGETDIR]\" para el nodo de confirmación (programo mi tarea durante el paso de confirmación). MSDN: CustomActionData Property

Finalmente, deberá acceder a la API de programación de tareas o utilizar Process.Start para llamar al schtasks.exe. La API le brindará una experiencia más fluida y sólida, pero opté por la ruta schtasks porque tenía la línea de comandos a mano.

Aquí está el código con el que finalmente terminé. Lo registré como una acción personalizada para instalar, confirmar y desinstalar.

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Configuration.Install; 
using System.Linq; 
using System.Security.Permissions; 
using System.Diagnostics; 
using System.IO; 


namespace MyApp 
{ 
    [RunInstaller(true)] 
    public partial class ScheduleTask : System.Configuration.Install.Installer 
    { 
     public ScheduleTask() 
     { 
      InitializeComponent(); 
     } 

     [SecurityPermission(SecurityAction.Demand)] 
     public override void Commit(IDictionary savedState) 
     { 
      base.Commit(savedState); 

      RemoveScheduledTask(); 

      string installationPath = Context.Parameters["DIR"] ?? ""; 
      //Without the replace, results in c:\path\\MyApp.exe 
      string executablePath = Path.Combine(installationPath, "MyApp.exe").Replace("\\\\", "\\"); 

      Process scheduler = Process.Start("schtasks.exe",string.Format("/Create /RU SYSTEM /SC HOURLY /MO 2 /TN \"MyApp\" /TR \"\\\"{0}\\\"\" /st 00:00", executablePath)); 
      scheduler.WaitForExit(); 
     } 

     [SecurityPermission(SecurityAction.Demand)] 
     public override void Uninstall(IDictionary savedState) 
     { 
      base.Uninstall(savedState); 
      RemoveScheduledTask(); 
     } 

     private void RemoveScheduledTask() { 
      Process scheduler = Process.Start("schtasks.exe", "/Delete /TN \"MyApp\" /F"); 
      scheduler.WaitForExit(); 
     } 
    } 
} 
+0

¡Puntuación! Buena respuesta, ahorró la mitad de mi día ;-) –

Cuestiones relacionadas