在任务中重定向过程标准输入

时间:2014-08-09 14:00:44

标签: c# process task stdin streamwriter

我尝试在单独的线程中启动C#(运行jar文件的Java.exe)中的进程,并重定向它的StandardInput,StandardError和StandardOutput。

我已成功重定向StandardError和StandardOutput,但我遇到了StandardInput问题。 我以这种方式开始这个过程:

Action<object> MyAction = (object obj) =>
{
    MyProcess.Start();
    MyProcess.WaitForExit();
};
Task MyTask = new Task(MyAction);
MyTask.Start();

我需要的是能够在我的Windows窗体应用程序中有一个文本框和一个按钮,我可以在其中输入将发送到进程StandardInput的命令但是我找不到重定向它的方法& #34;在任务之外&#34;,从我意识到它需要一个streamWriter,但是当它在一个单独的线程中运行时,我找不到写入它的方法。

2 个答案:

答案 0 :(得分:0)

我不希望通过(并行)任务可以访问StandardInput是很容易的。 同时访问StandardInput的两个并行任务中的哪一个应该得到它的输入?

我的确认为你需要对缓冲区和/或流进行一些编程。

另外,您确定要发送到StandardInput进程吗?它通常是只读的。 (虽然它可以是其他任务/过程的StandardOutput)

答案 1 :(得分:0)

您可以在将StandardInput传递给StandardOutput之前获取Taskpublic partial class Form1 { private StreamWriter _streamWriter; private StreamReader _streamReader; public Form1() { InitializeComponent(); } public void InitializeProcess(object sender, EventArgs args) { var processStartInfo = new ProcessStartInfo { UseShellExecute = false, ErrorDialog = false, RedirectStandardError = true, RedirectStandardInput = true, RedirectStandardOutput = true } var myProcess = new Process(processStartInfo); Task.Run(() => { MyProcess.Start(); MyProcess.WaitForExit(); }); _streamWriter = MyProcess.StandardInput; _streamReader = MyProcess.StandardOutput; } public void ButtonEventHandler(object sender, EventArgs e) { _streamWriter.Writer( /* write stuff here */ ) } }

StreamWriter

这样,只要进程存在,您就可以访问其流。请注意,您必须添加一项检查以确保流程仍然有效,并最终处置您的StreamReaderWaitForExit

修改

我们可以注册到异步Process.Exited事件,而不是使用线程池线程来阻止等待 public void InitializeProcess(object sender, EventArgs args) { var processStartInfo = new ProcessStartInfo { UseShellExecute = false, ErrorDialog = false, RedirectStandardError = true, RedirectStandardInput = true, RedirectStandardOutput = true, } var myProcess = new Process(processStartInfo); myProcess.EnableRaisingEvents = true; myProcess.Exited += (s, e) => { // Do whatever you want when process ends, like // Disposing of the streams. } myProcess.Start(); _streamWriter = MyProcess.StandardInput; _streamReader = MyProcess.StandardOutput; myProcess.Start(); }

{{1}}