Ich möchte verstehen, wie BackgroundWorker
verwendet wird. Ich habe versucht, es in ein Console C#-Projekt zu zerlegen, tatsächlich handelt es sich um eine Windows Form-Anwendung, bei der eine Schaltfläche die Ausführung von drei Hintergrundtasks auslöst. Wenn die Schaltfläche gedrückt wird, sollte sie deaktiviert werden, um weitere Klicks zu verhindern. Wenn alle drei Tasks abgeschlossen sind, sollte die Schaltfläche wieder aktiviert werden. Außerdem sollte der Erfolg der drei Tasks im Hauptthread getestet werden. Um zu verhindern, dass dies alles in eine Forms-App gemischt wird, versuche ich nun, die Grundlagen zu verstehen und das in die Forms-Anwendung zu übertragen. (Aus den Kommentareinstellungen können Sie erraten, wo meine Verständnisprobleme liegen) Überlegen Sie diesen (immer noch fehlerhaften) Code:
using System;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
namespace BGWorkerConsoleApp
{
class Program
{
// #region BackgroundWorker
//
private System.ComponentModel.BackgroundWorker worker = new System.ComponentModel.BackgroundWorker();
//
// #endregion
static void Main(string[] args)
{
// BackgroundWorker worker = new System.ComponentModel.BackgroundWorker();
worker.RunWorkerCompleted += TestComplete;
worker.DoWork += TestConnection1;
// worker.DoWork += TestConnection2;
// worker.DoWork += TestConnection3;
DoWorkEventArgs e = new DoWorkEventArgs(); // ???
worker.RunWorkerAsync(e); // ???
}
private void TestConnection1(object sender, DoWorkEventArgs e)
{
bool success = false;
Thread.Sleep(14000); // steht für einen zeitaufwändigen Task
success = true;
e.Result = success;
}
private void TestConnection2(object sender, DoWorkEventArgs e)
{
bool success = false;
Thread.Sleep(10000); // steht für einen zeitaufwändigen Task
success = true;
e.Result = success;
}
private void TestConnection3(object sender, DoWorkEventArgs e)
{
bool success = false;
Thread.Sleep(5000); // steht für einen zeitaufwändigen Task
success = true;
e.Result = success;
}
private void TestComplete(object sender, RunWorkerCompletedEventArgs e)
{
Console.WriteLine("complete");
}
}
}
Meine Fragen:
Kann ich mehr als eine Aufgabe einem BackgroundWorker
hinzufügen? Wahrscheinlich nicht, da es nur ein RunWorkerAsync gibt. Angenommen, ich brauche einen Worker für jede Aufgabe, wie würde ich auf das Abschließen aller drei Aufgaben warten?
OK, ich möchte es jetzt zu einer Forms-Anwendung ändern, da der Schwerpunkt nicht darauf liegt, BackgroundWorker in einer Konsolen-App auszuführen, sondern vielmehr möchte ich verstehen, wie die Anwendung für mehrere BackgroundWorker entworfen werden kann und auf deren Abschluss wartet (einschließlich der Übergabe und Rückgabe von Parametern und Ergebnissen).
Hier ist der Code dafür in einer Form-Anwendung:
using System;
using System.Windows.Forms;
using System.ComponentModel;
using System.Threading;
namespace BackGroundWorkerForm
{
partial class Form1
{
///
/// Erforderliche Designer-Variable.
///
private System.ComponentModel.IContainer components = null;
private Button button;
///
/// Bereinigen aller verwendeten Ressourcen.
///
/// true, wenn verwaltete Ressourcen freigegeben werden sollen; andernfalls false.
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Formular-Designer generierter Code
///
/// Erforderliche Methode für die Designerunterstützung. Verändern Sie
/// den Inhalt dieser Methode nicht mit dem Code-Editor.
///
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Text = "Form1";
button = new System.Windows.Forms.Button();
button.Location = new System.Drawing.Point(100, 10);
button.Name = "button";
button.Size = new System.Drawing.Size(100, 20);
button.TabIndex = 5;
button.Text = "TestConnection";
button.Click += new System.EventHandler(this.RunTest);
button.Visible = true;
Controls.Add(button);
}
#endregion
private void RunTest(object o, EventArgs e)
{
BackgroundWorker worker = new System.ComponentModel.BackgroundWorker();
worker.RunWorkerCompleted += TestComplete;
worker.DoWork += TestConnection1;
// worker.DoWork += TestConnection2;
// worker.DoWork += TestConnection3;
worker.RunWorkerAsync();
}
private void TestConnection1(object sender, DoWorkEventArgs e)
{
bool success = false;
Thread.Sleep(10000); // steht für einen zeitaufwändigen Task
success = true;
e.Result = success;
}
private void TestConnection2(object sender, DoWorkEventArgs e)
{
bool success = false;
Thread.Sleep(10000); // steht für einen zeitaufwändigen Task
success = true;
e.Result = success;
}
private void TestConnection3(object sender, DoWorkEventArgs e)
{
bool success = false;
Thread.Sleep(10000); // steht für einen zeitaufwändigen Task
success = true;
e.Result = success;
}
private void TestComplete(object sender, RunWorkerCompletedEventArgs e)
{
button.Text= "complete";
}
}
}