在一个c#项目中运行两个exe文件

时间:2013-09-19 19:06:29

标签: c# console exe


我正在尝试编写一个执行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();
        }


    }

2 个答案:

答案 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();
    }
}