如何运行控制台应用程序,捕获输出并将其显示在Literal中?

时间:2011-02-25 20:34:09

标签: c# asp.net-2.0 system.diagnostics

我看到我可以使用System.Diagnostics.Process启动进程。我正在尝试使用以下代码,但它无法正常工作。该页面刚挂起,我必须重新启动IIS ...

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Diagnostics;

public partial class VideoTest : System.Web.UI.Page
{
    List<string> outputLines = new List<string>();
    bool exited = false;

    protected void Page_Load(object sender, EventArgs e)
    {
        string AppPath = Request.PhysicalApplicationPath;

        Process myProcess = new Process();

        myProcess.StartInfo.UseShellExecute = false;
        myProcess.StartInfo.FileName = AppPath + "\\bin\\ffmpeg.exe";
        myProcess.StartInfo.CreateNoWindow = true;
        myProcess.OutputDataReceived += new DataReceivedEventHandler(OutputHandler);
        myProcess.Exited += new EventHandler(ExitHandler);
        myProcess.Start();

        while (!exited)
        {
            // This is bad bad bad bad....
        }

        litTest.Text = "";
        foreach (string line in outputLines)
            litTest.Text += line;
    }

    private void OutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
    {
        outputLines.Add(outLine.Data);
    }

    // Handle Exited event and display process information.
    private void ExitHandler(object sender, System.EventArgs e)
    {
        exited = true;
    }
}

1 个答案:

答案 0 :(得分:1)

我做了一些非常类似于你的解决方案 - 这对我来说很好用:

ProcessStartInfo pInfo = new ProcessStartInfo("cmd.exe");
pInfo.FileName = exePath;
pInfo.WorkingDirectory = new FileInfo(exePath).DirectoryName;
pInfo.Arguments = args;
pInfo.CreateNoWindow = false;
pInfo.UseShellExecute = false;
pInfo.WindowStyle = ProcessWindowStyle.Normal;
pInfo.RedirectStandardOutput = true;
Process p = Process.Start(pInfo);
p.OutputDataReceived += p_OutputDataReceived;
p.BeginOutputReadLine();
p.WaitForExit();
// set status based on return code.
if (p.ExitCode == 0) this.Status = StatusEnum.CompletedSuccess;
   else this.Status = StatusEnum.CompletedFailure;

有趣的差异似乎是使用WaitForExit(),可能还有BeginOutputReadLine()。