Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用进程类vs cmd c运行进程时的奇怪行为#_C#_Process_Console Application - Fatal编程技术网

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

C# 使用进程类vs cmd c运行进程时的奇怪行为#,c#,process,console-application,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 DataRecei

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

有什么问题吗?
解决这个问题的好办法是什么?

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

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

我认为幕后工作人员会对你很好。看一看

此外:

cmd程序在大多数情况下都是线性的

WinForm程序不是。您必须分别创建GUI和工作线程。
GUI仅用于输入和显示。您应该在另一个线程中执行的所有其他操作,因为否则您将阻止GUI。

对于不起作用的代码,请创建一个,以便我们可以帮助您。我将处理:)同时,您可以告诉我,我在代码中设置进程的方式是否有问题吗?可能这里不清楚,对此我很抱歉,但实际上我完全按照你说的做了。我的GUI是独立的,线程是独立的。睡眠只是为了产生一个小的延迟(我把它记下来)你使用委托事件来报告输出吗?你对每个backroundworker都使用相同的事件吗?只是猜测,但是,如果两个backgroundworker同时调用事件,是否会导致全局变量出错?您是指OnDataOutputFromProcess事件?