C#程序自动化 - 程序挂起/不起作用

时间:2015-06-11 05:05:01

标签: c# process console automation

我一直在尝试制作一个程序来自动执行在我的计算机上运行不同进程的过程。到目前为止,我已经运行了以下程序运行BleachBit的控制台版本(它就像CCleaner一样),该过程出现在任务管理器中,它在大约25kb的进程RAM中命中,然后CPU使用率变为0%并且只是坐着多年没有做任何事,永不放弃。

我在代码中做错了会导致这种情况发生吗? 我已经尝试编辑app.manifest以确保程序必须以管理员身份运行,以防它需要更多权限

此外,当在bat文件中运行类似的代码来运行程序时,它会打开自己的窗口并运行正常,所以我不确定。任何朝着正确方向的帮助都会很棒。

我正在运行的代码如下。

static void Main(string[] args)
    {
        string Log = "";
        if (File.Exists(Environment.CurrentDirectory + "\\BleachBit\\bleachbit_console.exe"))
        {
            Log += "File exists";
            Log += RunProgramCapturingOutput("\\BleachBit\\bleachbit_console.exe", "--preset --clean");
        }
        else
            Log += "Program not found. Please place at \\BleachBit\\bleachbit_console.exe";
        File.WriteAllText("log.txt", Log);
        Console.ReadLine();
    }

    public static string RunProgramCapturingOutput(string filename, string arguments)
    {
        ProcessStartInfo processInfo = new ProcessStartInfo()
        {
            FileName = Environment.CurrentDirectory + filename,
            Arguments = arguments,
            CreateNoWindow = false,
            UseShellExecute = false,
            WorkingDirectory = Path.GetDirectoryName(Environment.CurrentDirectory + filename),
            RedirectStandardError = false,
            RedirectStandardOutput = true
        };

        Process process = Process.Start(processInfo);
        process.WaitForExit();

        string output = output = process.StandardOutput.ReadToEnd();
        Console.WriteLine("Output: " + output);

        process.Close();
        return output;
    }

1 个答案:

答案 0 :(得分:0)

将这些行切换为:

string output = output = process.StandardOutput.ReadToEnd(); process.WaitForExit();

允许避免死锁。由于硬盘I / O,该程序似乎是一个相对较慢的运行程序,只是给它时间,你会看到它完成。

我从https://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput(v=vs.110).aspx

发现了这个死锁问题

它在代码块中的状态:“//为了避免死锁,请先读取输出流,然后再等待。”