Process.Start()导致应用程序挂起

时间:2015-12-18 09:42:24

标签: c# .net console-application

我在Process.Start()时遇到了困难 这是代码:

static void Main(string[] args)
{
    string fileName = @"C:\path_to_project\bin\Debug\helloworld.exe";

    ProcessStartInfo info = new ProcessStartInfo(fileName);
    info.UseShellExecute = false;
    info.RedirectStandardInput = true;
    info.RedirectStandardOutput = true;
    info.RedirectStandardError = true;
    info.CreateNoWindow = true;

    Process process = Process.Start(info);
    string error = process.StandardError.ReadToEnd();
    string returnvalue = process.StandardOutput.ReadToEnd();

    process.WaitForExit();
    Console.ReadLine();
}

代码应该只调用helloworld控制台应用程序,它只有一行Console.WriteLine("Hello World"),没什么特别的。

当我调试此代码时,我到达Process process = Process.Start(info);然后当我点击Step(F10)时没有任何反应。我的应用程序挂起,我开始的过程就在那里,但它没有完成。我需要杀死所有人。

这段代码适用于我的同事的机器,但在我的机器上,这个过程只是挂起,我唯一能做的就是杀死这个过程。

我还注意到,当我在资源管理器中双击任何控制台应用程序时,光标会将状态更改为忙,并且在我杀死explorer.exe之前永远不会更改。

可能是某些安全问题还是恶意软件?

2 个答案:

答案 0 :(得分:2)

Avast Antivirus拦截了Process.Start(),可能它试图对我尝试启动的应用程序进行沙盒化,以便它挂起。

我暂时禁用了盾牌,现在可以了。

谢谢大家的努力。

答案 1 :(得分:0)

所以实际上你的代码看起来很好。它通过一个简单的“Hello World!”对我有用。控制台应用程序。

但是,我记得前一段时间我们遇到过这样的问题,我们尝试从输出中获取的进程挂起process.WaitForExit()

不幸的是,我不记得这是否与你在这里遇到的问题完全相同。但我建议你尝试另外一种可能性:

static void Main(string[] args)
{
    string fileName = @"C:\path_to_project\bin\Debug\helloworld.exe";

    ProcessStartInfo info = new ProcessStartInfo(fileName);
    info.UseShellExecute = false;
    info.RedirectStandardInput = true;
    info.RedirectStandardOutput = true;
    info.RedirectStandardError = true;
    info.CreateNoWindow = true;

    StringBuilder outputBuilder = new StringBuilder();
    StringBuilder errorBuilder = new StringBuilder();

    Process process = new Process {StartInfo = info};
    process.OutputDataReceived += (sender, e) => outputBuilder.Append(e.Data);
    process.ErrorDataReceived += (sender, e) => errorBuilder.Append(e.Data);

    process.Start();
    process.BeginErrorReadLine(); // do this after process.Start()
    process.BeginOutputReadLine();

    process.WaitForExit();

    string error = errorBuilder.ToString();
    string returnvalue = outputBuilder.ToString();

    Console.WriteLine("Returned: {0}", returnvalue);
    Console.WriteLine("Error: {0}", error);
    Console.ReadLine();
}

对不起,我无法解释为什么你的代码挂起了(正如我说它对我有用)。但也许这种变化可行。