2017-10-22 4 views
-1

Ich habe drei Befehle auszuführen, die darauf warten, dass jeder Befehl beendet wird, bevor der nächste gestartet wird.Wie kann ich mehrere Befehle ausführen, die darauf warten, dass jeder Befehl beendet wird, bevor der nächste gestartet wird?

Basierend auf meiner Implementierung nach Abschluss der ersten wird die zweite gestartet, aber backgroundWorker1_RunWorkerCompleted wird überhaupt nicht erhöhen.

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]); 
     } 
    } 
} 
+1

Hat meine Antwort Hilfe? –

+0

Wenn es nicht mehr gibt, wird es schließlich abstürzen, weil Sie nie Grenzen dies überprüfen: 'runCmd (Befehle [Befehl])'. – DonBoitnott

+0

Das sollte helfen: https://Stackoverflow.com/questions/1728099/visual-c-sharp-gui-stops-responding-when-process-waitforexit-is-used – DonBoitnott

Antwort

0

Background ist ein Zeitverbrauch nur d.h, wenn der Staat es neu starten, werde nicht abgeschlossen ist, u müssen, um sie wieder instanziiert.

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(); 
    } 
} 
+0

Ich weiß, dass meine Frage ist, wie überprüfe ich/weiß, wann der Befehl zur Eingabeaufforderung beendet wurde. Ich mache in der Wendung: cmd.WaitForExit(); Aber was verhindert, dass der Backgroundworker neu startet und den nächsten Befehl ausführt, während der Prozess des ersten Befehls noch nicht beendet/beendet wurde? –

+0

Sobald die Eingabeaufforderung die nächste Anweisung beendet, nachdem cmd.WaitForExit() ausgeführt wurde. In unserem Fall gibt es nichts, also wird es zu einem anderen Ereignis gehen, das backgroundWorker1_ProgressChanged und dann backgroundWorker1_RunWorkerCompleted ist –

Verwandte Themen