【问题标题】:strange behavior when running process using process class vs cmd c#使用进程类与cmd c#运行进程时的奇怪行为
【发布时间】:2014-08-28 08:52:21
【问题描述】:

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

可能是什么问题? 有什么好的方法可以解决这个问题?

【问题讨论】:

  • 对于不起作用的代码,请创建MVCE,以便我们为您提供帮助。
  • 我会继续努力的 :) 同时你能告诉我我在代码中设置流程的方式是否有问题吗?

标签: c# process console-application


【解决方案1】:

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

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

我认为后台工作人员会为您工作。看看here

另外:

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

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

【讨论】:

  • 也许这里不清楚,对此我很抱歉,但实际上我完全按照你所说的做了。我的 GUI 是独立的,Thread.Sleep 的存在只是为了稍微延迟(我会把它取下来)
  • 您是否使用委托事件来报告输出?
  • 您是否对每个后台工作人员使用相同的事件?
  • 这只是猜测,但如果两个后台工作人员同时调用事件,全局变量会被搞砸吗?
  • 你的意思是事件 OnDataOutputFromProcess ?
猜你喜欢
  • 2021-07-03
  • 2011-01-21
  • 1970-01-01
  • 2013-03-15
  • 2016-07-14
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多