2010-08-23 6 views
0

Je souhaite analyser une file d'attente toutes les 10 secondes à l'aide d'une minuterie. S'il y a plus de 0 éléments dans cette file d'attente, alors déposez le premier, passez-le en tant qu'argument à un processus et exécutez ce processus. La minuterie doit être désactivée pendant l'exécution de ce processus. Une fois le processus terminé, il devrait réactiver le minuteur.Minuterie de file d'attente de processus

Les éléments de la file d'attente peuvent être ajoutés manuellement ou peuvent provenir d'une base de données.

Le code C# suivant ne fonctionne pas une fois le premier processus terminé. Pour une raison quelconque, la minuterie n'est pas activée à nouveau. Quelqu'un peut-il aider?

public MainForm() 
{ 
    InitializeComponent(); 

    queue = new Queue<string>(); 
    process = new Process(); 
    process.Exited += new EventHandler(Process_Exited); 
    process.EnableRaisingEvents = true; 
} 

void StartProcess(string args) 
{ 
    ProcessStartInfo psi = new ProcessStartInfo(); 
    psi.FileName = @"C:\Program Files\My Software\RunProcess.exe"; 
    psi.Arguments = args; 
    psi.WindowStyle = ProcessWindowStyle.Minimized; 

    process.StartInfo = psi; 
    process.Start(); 
} 

void Process_Exited(object sender, EventArgs e) 
{ 
    timer.Enabled = true; 
} 

void Timer_Tick(object sender, EventArgs e) 
{ 
    if (queue.Count > 0) 
    { 
     timer.Enabled = false; 
     StartProcess(queue.Dequeue()); 
    } 
} 

Répondre

1

Je n'ai pas recherché les détails par manque de temps, mais j'ai découvert que l'envoi timer.Enabled = true; au thread UI fera l'affaire.

EDIT: Juste vérifié MSDN: « Cette minuterie Windows est conçu pour un environnement mono-thread où des fils de l'interface utilisateur sont utilisés pour effectuer un traitement Il exige que le code utilisateur ont une pompe de message d'interface utilisateur disponible et fonctionne toujours de la même. fil, ou maréchal l'appel sur un autre fil "

0

Pensez à utiliser Process.WaitForExit() au lieu de traiter l'événement Exited. De cette façon, vous pouvez définir une valeur de délai (dans le cas où le processus ne se termine jamais) et vous pouvez démarrer/arrêter le minuteur à partir de la méthode Timer_Tick().

+0

Le processus peut s'exécuter pendant une durée variable en fonction du volume de données qu'il doit traiter. Le problème est qu'il ne peut pas fonctionner en parallèle, c'est pourquoi je dois faire une file d'attente. Le temps pris par ce processus peut être compris entre 30 secondes et 3 heures. Au cours de laquelle mon logiciel doit également effectuer d'autres tâches, il ne peut donc pas utiliser WaitForExit(). –

0

Toute chance avec:.

timer.AutoReset = true;

?