首先,我已经阅读了所有相关主题,它们提供了一般的想法,但实现对我不起作用:
将字符串从一个控制台应用程序发送到另一个
如何以用户键入的方式向控制台发送输入?
从控制台应用程序发送输入/获取输出 (C#/WinForms)
我有一个控制台应用程序,在取消请求之前在后台执行某些操作。 典型的使用场景是:
1)执行应用程序
2)输入数据
3)发出启动命令
4)一段时间后,输入停止命令
5)退出应用程序
子应用程序
我需要的是某种主机工具来控制这个应用程序——在每个实例上产生多个实例并执行所需的用户操作。 主机应用程序
当我运行这个工具时,在第一次输入后,它会崩溃并显示“已停止工作”错误,并提示将内存转储发送给Microsoft。在VS中的输出窗口没有显示异常。
猜测此问题发生在应用程序之间,可能是由于输出流缓冲区溢出(子应用程序每秒钟写入了大量星号,模拟了可能很大的实际输出),我还不知道如何解决。我不需要将子进程的输出传递给主机(只需要向子进程发送启动-停止命令),但注释掉RedirectStandardOutput和OutputDataReceived并不能解决这个问题。有什么好的想法吗?
将字符串从一个控制台应用程序发送到另一个
如何以用户键入的方式向控制台发送输入?
从控制台应用程序发送输入/获取输出 (C#/WinForms)
我有一个控制台应用程序,在取消请求之前在后台执行某些操作。 典型的使用场景是:
1)执行应用程序
2)输入数据
3)发出启动命令
4)一段时间后,输入停止命令
5)退出应用程序
子应用程序
Program.cs
:static void Main()
{
Console.WriteLine("Enter input parameter : ");
var inputParameter = Console.ReadLine();
Console.WriteLine("Entered : " + inputParameter);
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
Task.Factory.StartNew(() =>
{
while (true)
{
if (token.IsCancellationRequested)
{
Console.WriteLine("Stopping actions");
return;
}
// Simulating some actions
Console.Write("*");
}
}, token);
if (Console.ReadKey().KeyChar == 'c')
{
tokenSource.Cancel();
Console.WriteLine("Stop command");
}
Console.WriteLine("Finished");
Console.ReadLine();
}
我需要的是某种主机工具来控制这个应用程序——在每个实例上产生多个实例并执行所需的用户操作。 主机应用程序
Program.cs
:static void Main()
{
const string exe = "Child.exe";
var exePath = System.IO.Path.GetFullPath(exe);
var startInfo = new ProcessStartInfo(exePath)
{
RedirectStandardOutput = true,
RedirectStandardInput = true,
WindowStyle = ProcessWindowStyle.Hidden,
WindowStyle = ProcessWindowStyle.Maximized,
CreateNoWindow = true,
UseShellExecute = false
};
var childProcess = new Process { StartInfo = startInfo };
childProcess.OutputDataReceived += readProcess_OutputDataReceived;
childProcess.Start();
childProcess.BeginOutputReadLine();
Console.WriteLine("Waiting 5s for child process to start...");
Thread.Sleep(5000);
Console.WriteLine("Enter input");
var msg = Console.ReadLine();
// Sending input parameter
childProcess.StandardInput.WriteLine(msg);
// Sending start command aka any key
childProcess.StandardInput.Write("s");
// Wait 5s while child application is working
Thread.Sleep(5000);
// Issue stop command
childProcess.StandardInput.Write("c");
// Wait for child application to stop
Thread.Sleep(20000);
childProcess.WaitForExit();
Console.WriteLine("Batch finished");
Console.ReadLine();
}
当我运行这个工具时,在第一次输入后,它会崩溃并显示“已停止工作”错误,并提示将内存转储发送给Microsoft。在VS中的输出窗口没有显示异常。
猜测此问题发生在应用程序之间,可能是由于输出流缓冲区溢出(子应用程序每秒钟写入了大量星号,模拟了可能很大的实际输出),我还不知道如何解决。我不需要将子进程的输出传递给主机(只需要向子进程发送启动-停止命令),但注释掉RedirectStandardOutput和OutputDataReceived并不能解决这个问题。有什么好的想法吗?