【问题标题】:How can I execute multiple commands waiting for each command to finish before starting the next one?如何在开始下一个命令之前执行多个命令等待每个命令完成?
【发布时间】:2018-04-03 10:50:37
【问题描述】:

我要执行三个命令,等待每个命令完成后再开始下一个命令。

根据我完成第一个后的实现,第二个将启动,但 backgroundWorker1_RunWorkerCompleted 根本不会引发。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace cmd_commands
{
    public partial class Form1 : Form
    {
        string[] commands = new string[] {
         @"test",
         @"test1",
         @"test2" };

        int command = 0;

        public Form1()
        {
            InitializeComponent();
        }

        public void runCmd(string command)
        {
            ProcessStartInfo cmdsi = new ProcessStartInfo("cmd.exe");
            cmdsi.Arguments = command;
            Process cmd = Process.Start(cmdsi);
            cmd.WaitForExit();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            runCmd(commands[command]);
            backgroundWorker1.ReportProgress(0, command);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            label1.Text = "Working on command number: " + e.UserState.ToString();
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
          command++;
          runCmd(commands[command]);
        }
    }
}

【问题讨论】:

  • 我的回答有帮助吗?
  • 除非有更多,否则它最终会崩溃,因为你永远不会检查这个:runCmd(commands[command])
  • 这应该会有所帮助:*.com/questions/1728099/…

标签: c# .net winforms events backgroundworker


【解决方案1】:

BackgroundWorker 只能使用一次,即一旦状态完成,它就不会重新启动,您需要重新实例化它。

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    command++;

    if (command < commands.Length)
    {
        backgroundWorker1 = new BackgroundWorker();
        backgroundWorker1.DoWork += this.backgroundWorker1_DoWork;
        backgroundWorker1.ProgressChanged += this.backgroundWorker1_ProgressChanged;
        backgroundWorker1.RunWorkerCompleted += this.backgroundWorker1_RunWorkerCompleted;
        backgroundWorker1.RunWorkerAsync();
    }
}

【讨论】:

  • 我知道,我的问题是如何检查/知道命令提示符命令何时退出。我正在做的工作: cmd.WaitForExit();但是什么会阻止后台工作人员在第一个命令的进程尚未完成/退出时重新开始并执行下一个命令?
  • 一旦命令提示符退出 cmd.WaitForExit() 之后的下一条语句将执行。在你的情况下,什么都没有,所以它会去另一个事件,即 backgroundWorker1_ProgressChanged 然后是 backgroundWorker1_RunWorkerCompleted
最近更新 更多