process.OutputDataReceived的重复输出

时间:2017-02-09 15:42:20

标签: process io-redirection redirectstandardoutput

我遇到了重定向输出重复内容的问题。

在我的表单中,我有两个按钮:Run和Clear。

  public partial class BatchRun : Form
 {
  Process process = new Process();

   public BatchRun()
    {
        InitializeComponent();                         
    }

    private void RunBTN_Click(object sender, EventArgs e)
    {
        //initiate the process 
        this.process.StartInfo.FileName = sMasterBATname;
        this.process.StartInfo.UseShellExecute = false;
        this.process.StartInfo.CreateNoWindow = true;
        this.process.StartInfo.RedirectStandardOutput = true;
        this.process.OutputDataReceived += new DataReceivedEventHandler(StandardOutputHandler);
        this.process.StartInfo.RedirectStandardInput = true;
        this.process.Start();
        this.process.BeginOutputReadLine();
    }

public void StandardOutputHandler(object sender, DataReceivedEventArgs outLine)
    {
        BeginInvoke(new MethodInvoker(() =>
                {
                    Label TestLBL = new Label();
                    TestLBL.Text = text.TrimStart();
                    TestLBL.AutoSize = true;
                    TestLBL.Location = new Point(10, CMDpanel.AutoScrollPosition.Y + CMDpanel.Controls.Count * 20);
                    CMDpanel.Controls.Add(TestLBL);
                    CMDpanel.AutoScrollPosition = new Point(10, CMDpanel.Controls.Count * 20);
                }));            
    }


private void ClearBTN_Click(object sender, EventArgs e)
    {           
        CMDpanel.Controls.Clear();                       
        this.process.CancelOutputRead();
        this.process.Close();
        this.process.Refresh();                                   
    }
 }

如果我只想运行一次进程,即在进程完成后关闭表单,这非常有用。

但是,我需要允许用户重新运行相同的过程或运行一个新过程,因此我添加了一个清除按钮,清除各种控件等。

我遇到的问题是,点击清除按钮后,我想再次单击运行按钮而不关闭,然后运行sMAsterBAT文件(CMD)。

StandardOutputHandler似乎包含上一次运行的内容以及新的内容,导致我的CMDpanel中出现重复的标签。

这是存储在某种缓冲区中的吗?如果是这样,我如何清除它以允许我重新运行?

有人可以解释为什么会这样,以及如何解决它。

1 个答案:

答案 0 :(得分:0)

向在工作中为我修理过的人发言。好容易lol

public void ConfigureServices(IServiceCollection services)
{
   (...)
   services.AddIdentity<ApplicationUser, IdentityRole>(x =>
   {
      x.Cookies.ApplicationCookie.LoginPath = new PathString("/Admin/Login");
      x.Cookies.ApplicationCookie.LogoutPath = new PathString("/Admin/LogOff");
   }
}

}