2010-02-25 8 views
1

BeginOutputReadLine을 사용하여 비동기 모드에서 명령 줄 프로세스를 시작하는 프로그램이 있습니다. 내 문제는 일부 .OutputDataReceived 이벤트가 트리거 될 때 .Exited 이벤트가 트리거된다는 것입니다. 내 .Exited 이벤트에서 수행하는 작업은 내 모든 .OutputDataReceived 이벤트가 완료된 후에 만 ​​수행되어야합니다. 그렇지 않으면 일부 출력이 누락됩니다.비동기 모드의 StandardOutput 스트림 문제

스트림이 비어있을 때까지 기다릴 때 Process 클래스를 살펴 보았지만 스트림이 비어있을 때까지 기다릴 수는 있지만 동기화 모드에서만 찾을 수 있습니다. 아무도 도와 줄 수 있습니까?

고맙습니다.

답변

1

내 응용 프로그램이 Cygwin 응용 프로그램의 프론트 엔드이며, 응용 프로그램이 OutputDataReceived 이벤트를 통해 모든 데이터를 수신하기 전에 종료되기도하고 데이터가 손실되는 경우가 있습니다.

수정/해킹은 프로세스 개체가 사라지기 전에 출력 AsyncStreamReader에서 WaitUtilEOF를 호출하는 것입니다 (WaitUtilEOF는 .NET Framework 내부 클래스에 있기 때문에 리플렉션을 사용해야 함). 이렇게하면 모든 비동기 데이터가 OutputDataReceived를 통해 플러시 될 때까지 호출자가 차단됩니다. 나는 직접 문제를 해결할 수 있을지 모르겠지만, 도움이 될 수 있습니다 ...

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); 
} 

그리고 난 이런 식으로 전화 해요 :

WaitUntilAsyncStreamReachesEndOfFile(process, "output"); 

행운을 빕니다!