C # - как закрыть стандартные входные и выходные потоки при выходе из процесса? - PullRequest
0 голосов
/ 12 августа 2010

У меня есть процесс, который должен запустить дочерний процесс и связаться с ним через стандартный ввод и вывод. Дочерний процесс должен иметь возможность автоматически завершать себя; Однако у меня возникают проблемы с правильным закрытием потоков.

Вот соответствующий код из дочернего / клиентского процесса:

// 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 Ответ

1 голос
/ 12 августа 2010

Убедитесь, что для потока клиента, выполняющего ReadLine (), IsBackground имеет значение true. НЕ делайте Abort () / Join () в этой теме. Просто закройте все не фоновые темы. Я обнаружил, что даже если для IsBackground задано значение true, выполнение Abort () / Join () в фоновом потоке заставило мое тестовое приложение ждать ввода, однако удаление Abort () / Join () и просто регулярный выход работали нормально.

...