C# Backgroundworker

.:L

0
Hi,

habe mir folgendes zusammengeschustert:

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace SDT
{
    class checkEvent
    {
        BackgroundWorker bw = new BackgroundWorker();
        // Alle benötigten Variablen für Events
        globVar globalWrk = new globVar();

        public void checkEvents(globVar eventList, bool active)
        {
            bw.WorkerSupportsCancellation = true;
            if (active)
                bw.RunWorkerAsync();
            else
                bw.CancelAsync();        
        }

        private void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            // Worker definieren
            BackgroundWorker worker = sender as BackgroundWorker;

            // Hier findet die eigentliche Arbeit statt
            while (true)
            {
                // Soll abgebrochen werden?
                if (worker.CancellationPending == true)
                {
                    e.Cancel = true;
                    break;
                }
                else
                {
                    for (int i = 0; i < 100; i++)
                    {
                        MessageBox.Show(Convert.ToString(i));
                        System.Threading.Thread.Sleep(500);
                    }
                }

            }
        }
    }


}

Der bw.RunWorkerAsync() wird aufgerufen, allerdings startet der backgroundworker nicht.
habe ich etwas übersehen?


Gruß
L
 
Zuletzt bearbeitet:
Kann es sein, dass du die Events nicht registrierst?

Code:
        public Page()
        {
            InitializeComponent();

            bw.WorkerReportsProgress = true;
            bw.WorkerSupportsCancellation = true;
            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
            bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
        }
Gewusst wie: Verwenden eines BackgroundWorker
 
"Der Name "bw_RunWorkerCompleted" ist im aktuellen Kontext nicht vorhanden."

Ansprechen kann ich den bw.* aber ganz normal.
 
Zuletzt bearbeitet:
"Der Name "bw_RunWorkerCompleted" ist im aktuellen Kontext nicht vorhanden."

Ansprechen kann ich den bw.* aber ganz normal.

Solch ein Handler existiert bei dir auch nicht. Erzeug ihn einfach ;)

Code:
[COLOR=Blue]private[/COLOR] [COLOR=Blue]void[/COLOR] bw_RunWorkerCompleted([COLOR=Blue]object[/COLOR] sender, RunWorkerCompletedEventArgs e) { 
MessageBox.Show("Fertig");
}

Das selbe gilt btw auch für das Event ProgressChanged.
 
Hm ok, aber woher weiß der worker denn das er completed ist? Der soll bei mir mit nem timer in ner schleife laufen und nur über einen Button angehalten werden, dann brauch ich das Event doch nicht, oder?
 
Hm ok, aber woher weiß der worker denn das er completed ist? Der soll bei mir mit nem timer in ner schleife laufen und nur über einen Button angehalten werden, dann brauch ich das Event doch nicht, oder?

Sobald deine Methode bw_Work einen Wert zurückgibt (Sobald die Methode durchgelaufen ist), wird das Event WorkerCompleted gerufen. Ob du da nun einen Handler registrierst oder nicht, ist völlig deine Sache.

Code:
        public Page()
        {
            InitializeComponent();

            bw.WorkerReportsProgress = true;
            bw.WorkerSupportsCancellation = true;
            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
            //bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
            //bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
        }

Würde es also schon tun ;)
 
so, hab also endlich geschafft :>

Der bw war nur falsch deklariert :rolleyes: shame

Habe noch eine Frage:
Ich hab die Handler erstellt (DoWork, Progress, Completed).

Es gibt ja die Methode um den worker zu "starten" bw.RunWorkerAsync();

Aber vorher muss ich doch erstmal den Handler aufrufen, oder?
Und wenn ich das getan hab, läuft er ja schon los...

Oder setze ich den Handler falsch ein?

Momentan starte ich so:
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerAsync();


und möchte so stoppen:
bw.CancelAsync();
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);


das stoppen funktioniert allerdings nicht, was mache ich falsch?
http://msdn.microsoft.com/de-de/library/cc221403(VS.95).aspx
 
so, hab also endlich geschafft :>

Der bw war nur falsch deklariert :rolleyes: shame

Habe noch eine Frage:
Ich hab die Handler erstellt (DoWork, Progress, Completed).

Es gibt ja die Methode um den worker zu "starten" bw.RunWorkerAsync();

Aber vorher muss ich doch erstmal den Handler aufrufen, oder?
Und wenn ich das getan hab, läuft er ja schon los...

Oder setze ich den Handler falsch ein?

Momentan starte ich so:
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerAsync();

Ich kenne die Eigenheiten von diesem speziellen BackgroundWorker nicht, aber an sich ist es korrekt so, wie du es nutzt.
Der Handler wird vom Worker gerufen, wenn du RunWorkerAsync() ausführst.

und möchte so stoppen:
bw.CancelAsync();
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);


das stoppen funktioniert allerdings nicht, was mache ich falsch?
http://msdn.microsoft.com/de-de/library/cc221403(VS.95).aspx

Ein Worker ist an sich ein eigenständiger Thread. Threads zu "killen" ist an sich nicht vorgesehen bzw. sollte vermieden werden.

Versuch es mal folgendermaßen:
Angenommen im Worker-Thread läuft eine Endlosschleife, die beendet werden soll, wenn du eine bestimmte Methode aufrufst. Dann erzeug dir eine Thread-Sichere Variable, die angibt, ob die Schleife laufen darf.
Die Cancel-Methode setzt dann diese Variable entsprechend und der Worker bricht die Schleife ab. Folglich durchläuft dieser den restlichen Methoden-Body. Du musst natürlich bedenken, dass der Thread ggf. noch nciht fertig ist wenn der Prozess, der den Thread gestartet hat, beendet wird.
Hier werfe ich einfach mal das Stichwort join in den Raum ;)
 
Vielleicht erkläre ich einfach mal was ich vorhabe :>

Hatte mir einen Timer gebaut, mit dem ich Events zu einem bestimmten Zeitpunkt ausführen kann, also: Programmaufrufe, bestimtme commands (Shutdown, Lautstärke, ...) etc.

Früher habe ich das mit einem Timer gemacht, aber das is ja eigentlich nicht das wahre...
 
Vielleicht erkläre ich einfach mal was ich vorhabe :>

Hatte mir einen Timer gebaut, mit dem ich Events zu einem bestimmten Zeitpunkt ausführen kann, also: Programmaufrufe, bestimtme commands (Shutdown, Lautstärke, ...) etc.

Früher habe ich das mit einem Timer gemacht, aber das is ja eigentlich nicht das wahre...

Da ich grad langeweile hab, hab ich dir mal fix was programmiert ...
Das ist allerdings in Java implementiert, musst es entweder selbst portieren, oder du erweiterst es ...
 
Zurück
Oben