2014-07-22 51 views
1

我試圖啓動一個進程(「cmd.exe」),然後啓動另一個程序(從cmd.exe),並能夠獲得輸出或發送輸入文本框。ASP.NET/C#在運行時顯示輸出

所以我創建了一個新的線程來凍結用戶界面,然後讀取標準輸出並將其顯示在文本框中。 但似乎只要進程啓動,我的用戶界面和進程之間的鏈接就會中斷。

這裏是我的代碼:

public partial class exec2 : System.Web.UI.Page 
{ 
    public delegate void Worker(); 
    private static Thread worker; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
    } 

    public void setTextBox(string s) 
    { 
     TextBox1.Text = TextBox1.Text + s; 
    } 

    protected void RunEXE() 
    { 

     System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
     System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo();  
     psi.FileName = "cmd.exe"; 
     psi.UseShellExecute = false; 
     psi.RedirectStandardOutput = true; 
     psi.RedirectStandardInput = true; 
     psi.RedirectStandardError = true; 
     psi.CreateNoWindow = true; 

     proc.StartInfo = psi; 

     setTextBox("Setting the process\n"); 

     // Start the process 
     proc.Start(); 
     setTextBox("Process started\n"); 

     // Attach the output for reading 
     System.IO.StreamReader sOut = proc.StandardOutput; 

     // Attach the in for writing 
     System.IO.StreamWriter sIn = proc.StandardInput; 

     // Exit CMD.EXE 
     sIn.WriteLine("EXIT"); 

     // Close the process 
     proc.Close(); 
     setTextBox("Process closed"); 

     string results = ""; 
     while (!sOut.EndOfStream) 
     { 
      results = results + sOut.ReadLine().Trim() + "\n"; 
      setTextBox(results.Replace(System.Environment.NewLine, "\n")); 

     } 

     // Close the io Streams; 
     sIn.Close(); 
     sOut.Close(); 
    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     Init(Work); 
    } 

    protected void Button2_Click(object sender, EventArgs e) 
    { 
     setTextBox("TEST\n"); 
    } 

    public static void Init(Worker work) 
    { 
     worker = new Thread(new ThreadStart(work)); 
     worker.Start(); 
    } 

    public void Work() 
    { 
     RunEXE(); 
    } 
} 

但只有 「設置過程」 顯示。 我覺得有一些我不明白的UI /過程管理。

回答

0

您正在服務器上啓動工作線程和進程; UI渲染管不坐在那裏等待它們 - 爲什麼會這樣? (你的代碼只是new Thread(...).Start())。坦率地說,你很幸運,你甚至可以看到「設置過程」 - 我會而不是期望繼續在一般情況下工作。 http響應被斷開;當其他事情發生時,您不會看到更新。如果您想更新已發送給客戶端的UI,則需要使用輪詢(ajax)或Web-sockets。

+0

那麼我不習慣網絡應用程序,你想介紹一下你會怎麼做? – Raizyl

+0

@Raizyl我已經做了 - 看最後一行。這不是一個適合於小職位的主題。 –

相關問題