2011-02-25 2 views
0

System.Diagnostics.Process로 프로세스를 시작할 수 있습니다. 다음 코드로 시도하고 있지만 작동하지 않습니다. 나는 당신의 솔루션과 매우 비슷한 짓을했는지콘솔 응용 프로그램을 실행하고 출력을 캡처하여 리터럴에 표시하려면 어떻게합니까?

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; 
    } 
} 
+3

아마도 콘솔 응용 프로그램에서이 코드를 테스트해야할까요? –

+0

ffmpeg.exe 출력을 캡처 할 수있는 곳에이 응용 프로그램이 실행되는 동안 내 응용 프로그램이 차단되고 출력이 표시되지 않으면 Exited 이벤트가 정상적으로 작동합니다. 최근 ffmpeg는 색깔이므로 표준 출력으로 가고 있는지 모르겠습니다. 또한 스레드에서 실행해야합니까? 제대로 작동한다면 최종 솔루션을 공유하십시오. 감사합니다. – Marie

답변

1

... 페이지 그냥 달려 내가 IIS를 다시 시작해야합니다 -이 나를 위해 잘 작동 :

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()을 사용할 수 있습니다.

+0

감사합니다. WaitForExit() 비트가 트릭을 수행했습니다. – Justin808

+0

명령 줄에서 명령을 실행하는 데 30 초가 걸리지 만이 방법을 통해 실행하려면 30-40 분이 걸릴 수 있습니다. – Justin808

+0

생각이 없습니다 - 나는 그 행동을 보지 못했습니다. –

관련 문제