我想通过c#运行Iperf 通过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个以上的流,我的应用程序不会过去,而只是挂起它应该退出
可能是什么问题? 围绕这个问题可以做些什么呢?
答案 0 :(得分:0)
首先,您应该避免不惜任何代价使用Thread.Sleep(x)。
我假设您没有使用backgroundWorker或新线程来执行IPerf进程?
我认为背景工作者会很适合你。看看here
另外:
cmd程序在大多数情况下非常线性。
WinForm程序没有。你必须分离GUI和工作线程。 GUI仅适用于输入和显示。除非你应该在另一个线程中执行,否则你将阻止GUI。