2010-02-25 68 views
1

我有一個使用BeginOutputReadLine以異步模式啓動命令行進程的程序。我的問題是.Exited事件被觸發時仍然有一些.OutputDataReceived事件被觸發。我在.Exited事件中所做的事情只有在我的所有.OutputDataReceived事件完成後纔會發生,否則我將會丟失一些輸出。標準輸出流在異步模式下的問題

我在Process類中查看是否有任何東西可以對我有用,等待流爲空,但我發現只有在同步模式下。你們能幫忙嗎?

Thanx。

回答

1

我遇到了一個類似的問題:我的應用程序本質上是一些cygwin應用程序的前端,有時應用程序會在通過OutputDataReceived事件接收到所有數據之前退出,並且會丟失數據。

我的修復/黑客是在過程對象消失之前在輸出AsyncStreamReader上調用WaitUtilEOF(必須使用反射,因爲WaitUtilEOF在.NET框架內部類上)。這會導致調用程序阻塞,直到通過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"); 

祝你好運!