2010-02-25 11 views
1

J'ai un programme qui lance les processus de ligne de commande en mode asynchrone, en utilisant BeginOutputReadLine. Mon problème est que l'événement .Exited est déclenché quand il y a encore des événements .OutputDataReceived déclenchés. Ce que je fais dans mon événement .Exited ne doit se produire qu'une fois tous mes événements .OutputDataReceived terminés, sinon il me manquera un résultat.Problème avec le flux StandardOutput en mode asynchrone

J'ai regardé dans la classe Process pour voir si quelque chose pouvait m'être utile, comme attendre que le flux soit vide, mais tout ce que je trouve est pour le mode de synchronisation seulement. Quelqu'un d'entre vous peut-il aider?

Thanx.

Répondre

1

J'ai rencontré un problème similaire: mon application est essentiellement une interface pour certaines applications cygwin et parfois l'application se termine avant toutes les données reçues via l'événement OutputDataReceived, et je perds des données. Mon problème/hack est d'appeler WaitUtilEOF sur la sortie AsyncStreamReader avant que l'objet de processus ne disparaisse (il faut utiliser la réflexion puisque WaitUtilEOF est sur une classe interne .NET framework). Cela provoque le blocage de l'appelant jusqu'à ce que toutes les données asynchrones aient été vidées via OutputDataReceived. Je ne sais pas si ça va directement résoudre votre problème, mais il pourrait aider ...

private static void WaitUntilAsyncStreamReachesEndOfFile(Process process, string field) 
{ 
    FieldInfo asyncStreamReaderField = typeof(Process).GetField(field, BindingFlags.NonPublic | BindingFlags.Instance); 
    object asyncStreamReader = asyncStreamReaderField.GetValue(process); 

    Type asyncStreamReaderType = asyncStreamReader.GetType(); 

    MethodInfo waitUtilEofMethod = asyncStreamReaderType.GetMethod(@"WaitUtilEOF", BindingFlags.NonPublic | BindingFlags.Instance); 

    object[] empty = new object[] { }; 

    waitUtilEofMethod.Invoke(asyncStreamReader, empty); 
} 

Et je vous appelle comme ça:

WaitUntilAsyncStreamReachesEndOfFile(process, "output"); 

Bonne chance!