我正在尝试编写一个执行2个不同.exe文件的程序,并将其结果输出到文本文件中。当我单独执行它们时,它们工作正常,但是当我尝试同时执行它们时,第二个进程不会运行。有人可以帮忙吗?
这是代码。 Player1.exe和Player2.exe是返回0或1的控制台应用程序。
static void Main(string[] args)
{
Process process1 = new Process();
process1.StartInfo.FileName = "C:/Programming/Tournament/Player1.exe";
process1.StartInfo.Arguments = "";
process1.StartInfo.UseShellExecute = false;
process1.StartInfo.RedirectStandardOutput = true;
process1.Start();
var result1 = process1.StandardOutput.ReadToEnd();
process1.Close();
Process process2 = new Process();
process2.StartInfo.FileName = "C:/Programming/Tournament/Player2.exe";
process2.StartInfo.Arguments = "";
process2.StartInfo.UseShellExecute = false;
process2.StartInfo.RedirectStandardOutput = true;
process2.Start();
string result2 = process2.StandardOutput.ReadToEnd().ToString();
process2.Close();
string resultsPath = "C:/Programming/Tournament/Results/Player1vsPlayer2.txt";
if (!File.Exists(resultsPath))
{
StreamWriter sw = File.CreateText(resultsPath);
sw.WriteLine("Player1 " + "Player2");
sw.WriteLine(result1 + " " + result2);
sw.Flush();
}
}
答案 0 :(得分:0)
<强> 1 强>
你在评论中写道:“程序甚至没有达到进程2。我通过设置断点来测试它。”
process1.Start()
可能会抛出异常。而不是在process2设置断点,而是逐行处理并找到异常。或者更好的是,添加一个try / catch块并报告错误。
<强> 2 强>
另一种可能性是ReadToEnd
的行为不符合预期。您可以Peek
查看是否有更多数据要通过循环读取:
var result1 = new StringBuilder()
while (process1.StandardOutput.Peek() > -1)
{
result1.Append(process1.StandardOutput.ReadLine());
}
第3 强>
如果这些进程没有立即提供数据并结束,那么您需要在开始等待其StandardOutput之前启动它们。在进行读取之前,请在每个进程上调用Start()
。
答案 1 :(得分:0)
我对使用进程知之甚少,但是当我需要一次运行单独的东西时,我会使用这种方法。我没有拉出你项目的底部,但检查一下,看看它是否有任何帮助。
class Program
{
static void Main(string[] args)
{
Process process1 = new Process();
process1.StartInfo.FileName = "C:/Programming/Tournament/Player1.exe";
process1.StartInfo.Arguments = "";
process1.StartInfo.UseShellExecute = false;
process1.StartInfo.RedirectStandardOutput = true;
Process process2 = new Process();
process2.StartInfo.FileName = "C:/Programming/Tournament/Player2.exe";
process2.StartInfo.Arguments = "";
process2.StartInfo.UseShellExecute = false;
process2.StartInfo.RedirectStandardOutput = true;
Thread T1 = new Thread(delegate() {
doProcess(process1);
});
Thread T2 = new Thread(delegate() {
doProcess(process2);
});
T1.Start();
T2.Start();
}
public static void doProcess(Process myProcess)
{
myProcess.Start();
var result1 = myProcess.StandardOutput.ReadToEnd();
myProcess.Close();
}
}