2010-07-29 14 views
2

Je développe une application basée sur les modules. Chaque planificateur d'utilisation add-on. Tâche planifiée du module complémentaire chargé. Mon application n'exécute qu'une seule instance. Parfois, l'application est fermée, parfois en cours d'exécution. Par conséquent, j'ai besoin d'utiliser Windows 7 Planificateur de tâchesEst-il possible d'utiliser le planificateur de tâches Windows 7 dans sa propre application?

Comment utiliser le planificateur de tâches sur votre propre application?

J'ai besoin de créer de nouvelles tâches de l'application
j'ai besoin que lorsque la fin de la tâche, Envoyer un message à ma demande ou invoquer une fonction de ma demande
Est-il possible?
Comment le faire?

Répondre

5

Découvrez ce projet sur CodeProject.

A New Task Scheduler Class Library for .NET

+0

Cette bibliothèque fonctionne vraiment sur Windows 7? – ebattulga

+0

Oui. Cela fonctionne sur Vista, donc ça marchera sur Windows 7. Il fait quelque chose dans le sens de ce que décrit Kate Gregory. –

5

Si vous voulez interagir avec le système Tâches planifiées de Windows 7 à partir de votre code pour créer, gérer ou supprimer une tâche qui ne pose aucun problème. (Je couvre ce dans le cadre de Windows 7 j'ai écrit pour Pluralsight.) Ajouter une référence COM à TaskScheduler et vous faire alors ce genre de chose:

ITaskService scheduler = new TaskSchedulerClass(); 
scheduler.Connect(null, null, null, null); 

ITaskFolder rootFolder = scheduler.GetFolder("\\"); 
ITaskFolder folder = rootFolder.GetFolders(0).Cast<ITaskFolder>().FirstOrDefault(
    f => f.Name == "Windows7Course"); 

if (folder == null) 
{ 
    folder = rootFolder.CreateFolder("Windows7Course", null); 
} 

ITaskDefinition task = scheduler.NewTask(0); 
IExecAction action = (IExecAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC); 

action.Path = typeof(SayHello.Form1).Assembly.Location; 
action.WorkingDirectory = Path.GetDirectoryName(typeof(SayHello.Form1).Assembly.Location); 

ISessionStateChangeTrigger trigger = (ISessionStateChangeTrigger)task.Triggers.Create(
    _TASK_TRIGGER_TYPE2.TASK_TRIGGER_SESSION_STATE_CHANGE); 

trigger.StateChange = _TASK_SESSION_STATE_CHANGE_TYPE.TASK_SESSION_UNLOCK; 

task.Settings.DisallowStartIfOnBatteries = true; 

task.RegistrationInfo.Author = "Kate Gregory"; 
task.RegistrationInfo.Description = "Launches a greeting."; 

IRegisteredTask ticket = folder.RegisterTaskDefinition(
    "GreetReturningUser", 
    task, 
    (int)_TASK_CREATION.TASK_CREATE_OR_UPDATE, 
    null, 
    null, 
    _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN, 
    null); 

Cet échantillon particulier exécute un exe qui est dans la même solution (un autre projet). Vous devrez ajuster le Action.Path, Action.WorkingDirectory etc pour répondre à vos besoins.

+1

c'est un bon début. Cependant, il existe un wrapper géré pour Task Scheduler dans CodePlex.com, ce qui le rend beaucoup plus facile. http://taskscheduler.codeplex.com/ – newman

0

Merci pour l'excellent exemple Kate, je suis tombé sur le fait que dans mes pérégrinations je n'ai pas rencontré votre code d'abord. J'ai eu une danse joyeuse avec l'enregistrement des tâches planifiées via le code C# et j'ai sans surprise eu à modifier mon code de création de calendrier car je rencontre des roadblocks sur un environnement que je n'avais jamais rencontré auparavant. J'espère que je suis arrivé le code plus robuste et pensé qu'il pourrait aussi être bénéfique pour d'autres si je partage certaines choses que vous pourriez essayer si les questions environnementales: rencontrant

  • Mettez le chemin de l'exécutable dans des guillemets doubles
  • Ne placez pas le dossier de travail entre guillemets
  • Une fois la tâche créée, si vous apportez des modifications ultérieures, appelez ask.RegisterChanges(); - il peut être utile de définir la tâche. Definition.Principal.RunLevel = TaskRunLevel.Highest;
  • Je passe par défaut à un compte système pour exécuter la tâche, mais dans certains environnements réseau, j'ai rencontré des problèmes que je n'ai pas pu comprendre mais j'ai pu résoudre en fournissant un compte utilisateur sous lequel exécuter la tâche.

le meilleur Matt