2014-08-28 57 views
0

我想通過C# 運行的Iperf通過CMD一切運轉時工作正常和快速 但我使用此代碼通過C#運行時:奇怪的行爲在運行過程中使用過程類VS CMD C#

public void RunProcess(string FileName, string Arguments, bool EventWhenExit) 
{ 
    process = new Process(); 

    process.EnableRaisingEvents = true; 
    process.OutputDataReceived += new DataReceivedEventHandler(OnDataReceivedEvent); 
    process.StartInfo.RedirectStandardOutput = true; 
    process.StartInfo.CreateNoWindow = true; 
    process.StartInfo.LoadUserProfile = false; 
    process.StartInfo.UseShellExecute = false; 
    process.StartInfo.FileName = FileName; // Gets or sets the application or document to start. 
    process.StartInfo.Arguments =Arguments;//Gets or sets the set of command-line arguments to use when starting the application  
    Thread.Sleep(1000); 
    if (EventWhenExit) 
    { 
     process.EnableRaisingEvents = true; 

     process.Exited += new EventHandler(myprocess_Exited);/*New line */ 

    } 

    process.Start(); 
    process.BeginOutputReadLine(); 
    PID = process.Id; 


} 

private void myprocess_Exited(object sender, EventArgs e) 
{ 
    process.Refresh(); 
    Thread.Sleep(2000); 
    onProcessEnd(this, "ENDOF " + Proc.ToString()); 
    Console.WriteLine("Process exsiting "); 
} 


private void OnDataReceivedEvent(object sender, DataReceivedEventArgs e) 
{ 

    string OutputFromProcess = e.Data; 
    //fire event to event handler class for further use 
    onDataOutputFromProcess(this, OutputFromProcess, Proc.ToString()); 
} 

我得到錯誤的奇怪的行爲: 當運行1流(使用Iperf你會知道...)每一個工作正常在控制檯和我的應用程序(winform) 但我運行3流和以上,我的應用程序不會超過,掛起時應該退出

會有什麼問題? 什麼可以很好的解決這個問題?

+1

對於無法使用的代碼,請創建一個[MVCE](http://stackoverflow.com/help/mcve),以便我們爲您提供幫助。 – nvoigt 2014-08-28 08:58:10

+0

我會努力:) 在意思,而你能告訴我,如果我的代碼中設置過程的方式有什麼問題嗎? – LordTitiKaka 2014-08-28 09:10:04

回答

0

首先,你應該避免使用Thread.Sleep(x)而不惜任何代價。

我假設你沒有使用backgroundWorker或新線程來執行IPerf進程?

我認爲背景工作者會適合你。看看here

另外:

一個cmd程序是在大多數情況下非常線性。

不是WinForm程序。你必須分離GUI和工作線程。 GUI僅用於輸入和顯示。換句話說,你應該在另一個線程中做,因爲否則你會阻止GUI。

+0

也許這裏並不清楚,我爲此感到抱歉,但實際上我完全按照你所提到的來做。我的GUI是獨立的,Thread.Sleep只是在那裏做一個小的延遲(我會把它取下) – LordTitiKaka 2014-08-28 11:44:08

+0

你使用委託事件來報告輸出嗎? – 2014-08-28 11:46:22

+0

是的,如果是這個問題的重要我會添加它 – LordTitiKaka 2014-08-28 11:56:53