我尝试在单独的线程中启动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,但是当它在一个单独的线程中运行时,我找不到写入它的方法。
答案 0 :(得分:0)
我不希望通过(并行)任务可以访问StandardInput是很容易的。 同时访问StandardInput的两个并行任务中的哪一个应该得到它的输入?
我的确认为你需要对缓冲区和/或流进行一些编程。
另外,您确定要发送到StandardInput进程吗?它通常是只读的。 (虽然它可以是其他任务/过程的StandardOutput)
答案 1 :(得分:0)
您可以在将StandardInput
传递给StandardOutput
之前获取Task
和public 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
这样,只要进程存在,您就可以访问其流。请注意,您必须添加一项检查以确保流程仍然有效,并最终处置您的StreamReader
和WaitForExit
修改强>
我们可以注册到异步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}}