使用进程类vs cmd c运行进程时的奇怪行为#

时间:2014-08-28 08:52:21

标签: c# process console-application

我想通过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个以上的流,我的应用程序不会过去,而只是挂起它应该退出

可能是什么问题? 围绕这个问题可以做些什么呢?

1 个答案:

答案 0 :(得分:0)

首先,您应该避免不惜任何代价使用Thread.Sleep(x)。

我假设您没有使用backgroundWorker或新线程来执行IPerf进程?

我认为背景工作者会很适合你。看看here

另外:

cmd程序在大多数情况下非常线性。

WinForm程序没有。你必须分离GUI和工作线程。 GUI仅适用于输入和显示。除非你应该在另一个线程中执行,否则你将阻止GUI。