2009-12-29 4 views
0

J'ai un thread, dans ce thread j'appelle une méthode qui prend beaucoup de temps à traiter.Lancer une application dans un thread à l'aide d'une minuterie

La méthode a un foreach en utilisant un compteur pour chaque itération (compteur ++)

Je veux faire:

  • Dans foreach, si le compteur> 20:
    • Vérifiez le cas échéant proccess with name = "SendMailService.exe" est en cours d'exécution.
    • Si PAS d'exécution, lancez en utilisant process.start(sendmailservice.exe);
    • En cas d'exécution attendez 3 minutes, puis vérifiez à nouveau.
  • Une fois le code foreach
    • Vérifiez le cas échéant proccess avec name = "SendMailService.exe" est en cours d'exécution.
    • Si le processus est en cours d'exécution, attendez la fin du processus.

Tout le monde peut me comprendre? toute aide serait appréciée.

Mon code est:

private void bEnviarAleatorioSeleccionados_Click(object sender, EventArgs e) 
{ 
    CrossThreadCalls(); 

    this.bEnviarAleatorioSeleccionados.Enabled = false; 

    // Threads werden erzeugt 
    Thread hiloMain = new Thread(
     new ThreadStart(EnviarAleatorioSeleccionadosYEnviarCorreo)); 
    hiloMain.Start(); // Threads werden gestartet 
} 

private void EnviarAleatorioSeleccionadosYEnviarCorreo() 
{ 
    string rutaFicheroMp3 = GetRutaFicheroMp3DeLoquendo(textoLoquendo); 

    int contador = 0; 
    foreach (ListViewItem item in lstRecientes.Items) 
    { 
     if (item.Checked) 
     { 
      contador++; 
      EnviarCorreoParaElementoListView(item, rutaFicheroMp3, item.Text); 
     } 

     // DO THE CHECK HERE, EACH 3 MINUTES (TIMER) !!!! HOW ???????? 
     if (contador > 20) 
     { 
      var listaP = Process.GetProcesses().FirstOrDefault(
       p => p.ProcessName == "ServicioEnvioCorreo.exe"); 
      if (listaP == null) 
      { 
       // Iniciar Envio de Correo 
       EnviarCorreosPorProceso(); 
      } 
     } 
    } 

    EliminarFicheroLoquendo(rutaFicheroMp3); 
    this.bEnviarAleatorioSeleccionados.Enabled = true; 
} 
+0

Vous devez marquer ceci avec la langue que vous utilisez. – Andrew

+0

Évidemment VB :) –

Répondre

0

Eh bien, deux choses:

Depuis que vous faites cela sur un thread séparé: de toute façon

// DO THE CHECK HERE, EACH 3 MINUTES (TIMER) !!!! HOW ???????? 
if (contador > 20) { ... } 

Vous pouvez facilement bloquer tout le fil pour votre vérification de 3 minutes, au lieu d'utiliser une minuterie. Un simple Thread.Sleep(180000); mettra un délai de 3 minutes dans votre boucle. Cela dit, je me demande si c'est vraiment la meilleure approche de ce problème. Puisque vous démarrez le processus vous-même, vous pouvez attacher un gestionnaire à l'événement Process.Exited et "redémarrer" le processus après sa fermeture. Cela éliminerait le besoin entier pour les boucles, les contrôles, et probablement même le fil séparé complet. Commencez simplement le processus, et quand il existe, redémarrez-le (20x).

+0

Je veux bloquer le fil, en utilisant Thread.Sleep (180000); Je vais tester Process.Exited, je trouverai un exemple de code. Merci monsieur. Bonne année. –

Questions connexes