我有一个需要启动子进程并通过标准输入和输出与之通信的进程。子进程应该能够自动终止;但是,我无法正常关闭流。
以下是来自子/“客户”流程的相关代码:
// 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()
。我做错了什么?
答案 0 :(得分:1)
确保执行ReadLine()的客户端线程将IsBackground设置为true。不要在此线程上执行Abort()/ Join()。关闭所有非后台线程。我发现即使将IsBackground设置为true,在后台线程上执行Abort()/ Join()也会导致我的测试应用程序等待输入,但是,删除Abort()/ Join()并且只是退出定期工作正常。