C# - 如何在进程退出时关闭标准输入和输出流?

时间:2010-08-12 15:39:51

标签: c# console pipe

我有一个需要启动子进程并通过标准输入和输出与之通信的进程。子进程应该能够自动终止;但是,我无法正常关闭流。

以下是来自子/“客户”流程的相关代码:

// This is started in a separate thread
private void watchStandardInput() {
    string line = null;
    do {
        try {
            line = Console.ReadLine();
        } catch (IOException) {
            return;
        }
        lock (inputWatcher) {
            switch (line) {
                // process command
            }
        }
    } while (line != null);
}

// This is called from the main thread
private void updateStatus(string statusMessage) {
    lock (inputWatcher) {
        Console.WriteLine(statusMessage);
    }
}

这是“服务器”代码:

// This is in the main thread
using (StreamReader sr = process.StandardOutput) {
    while (!process.HasExited) {
        processOutput(sr.ReadLine());
    }
}

// Finally, commands are sent in a separate thread.

现在我遇到了问题:当子进程应该退出时,服务器保持在sr.ReadLine(),客户端保持在Console.ReadLine()。我做错了什么?

1 个答案:

答案 0 :(得分:1)

确保执行ReadLine()的客户端线程将IsBackground设置为true。不要在此线程上执行Abort()/ Join()。关闭所有非后台线程。我发现即使将IsBackground设置为true,在后台线程上执行Abort()/ Join()也会导致我的测试应用程序等待输入,但是,删除Abort()/ Join()并且只是退出定期工作正常。