2011-07-28 1 views
1

Le programme que j'ai créé supprime les threads qui démarrent les exécutables via les processus. Chaque thread exécute la méthode ci-dessous qui démarre le processus et redirige la sortie des processus dans une chaîne (info.additional qui est par processus).

J'ai appris par beaucoup d'essais et d'erreurs que je dois rediriger la sortie d'une certaine façon (en utilisant des événements pour la sortie reçue) ou bien l'impasse des flux.

Maintenant, je cours sur une machine dual core et si j'ai deux threads en cours d'exécution et de démarrage des processus, le programme fonctionne très bien et capture parfaitement la sortie de ces processus. Mais quand je passe à plus de deux threads (plus de threads que j'ai de cœurs) la sortie n'est parfois pas capturée pour ceux-ci. Pourquoi est-ce? Et quelqu'un sait-il comment résoudre ce problème?
Merci, JoeC#, la sortie des processus n'est parfois pas capturée (incohérence)?

public void ThreadProc() 
    { 
     info.watch.Start(); 
     proc = InstantiateProcess(); 
     proc.Start(); 
     proc.BeginOutputReadLine(); 
    } 


    private void procOutputDataReceived(object sendingProcess, DataReceivedEventArgs e) 
    { 
     if (e.Data != null) 
     { 
      //Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId); 
      this.info.additional += e.Data.ToString(); 
     } 
    } 
+0

On ne sait pas si info.additional est par processus. Si ce n'est pas le cas, vous devez le verrouiller. –

+0

Désolé à ce sujet, il crée une nouvelle instance pour chaque thread désolé. –

Répondre

2

Je ne sais pas si cela pourrait être la cause du problème, mais basé sur le code ici votre ThreadProc est sortie avant que l'objet Process est fait. Selon les documents OutputDataReceived, vous devez appeler WaitForExit() "L'application qui traite la sortie asynchrone doit appeler la méthode WaitForExit() pour s'assurer que le tampon de sortie a été vidé." Basé sur cette ligne, je suppose que vous pourriez perdre des données si vous ne le faites pas. Sur une note non liée, les objets Process implémentent IDisposable, donc je recommanderais de changer votre méthode ThreadProc comme ceci (notez que je ne vois pas de déclaration de proc ici, mais comme vous dites que vous lancez plusieurs processus, je suppose que proc est pas une variable membre et la déclaration est juste à gauche dans l'échantillon):

public void ThreadProc() 
{ 
    info.watch.Start(); 
    using (var proc = InstantiateProcess()) 
    { 
     proc.Start(); 
     proc.BeginOutputReadLine(); 
     proc.WaitForExit(); 
    } 
} 
+1

Merci beaucoup l'homme! Cela l'a réparé. L'homme j'étais à perte ici. Je vais lire msdn la prochaine fois que j'ai une question. –

0

à moins que vous assurez-vous de garder les références aux objets Process, ils seront déchets collectés, dans lequel les événements de cas sur les arrêtera de tirer.

solution simple:

  • magasin les Process objets jusqu'à ce que le processus a pris fin
Questions connexes