| Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme. |
Diskussion: C# Backgroundworker im Forum Code Kitchen, in der Kategorie Software Home; Anzeige 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 ...
![]() |
| | #1 (permalink) |
| Senior Member | Anzeige 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);
}
}
}
}
}
} habe ich etwas übersehen? Gruß L Geändert von .:L (18.08.10 um 19:05 Uhr) |
| | |
| | #2 (permalink) |
| Registriert seit: 21.08.10 ![]() Likes: 10 | 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);
} |
| | |
| HaBOT | - Anzeige - |
| |
| | #3 (permalink) |
| Senior Member Themenstarter | "Der Name "bw_RunWorkerCompleted" ist im aktuellen Kontext nicht vorhanden." Ansprechen kann ich den bw.* aber ganz normal. Geändert von .:L (22.08.10 um 20:58 Uhr) |
| | |
| | #4 (permalink) | |
| Registriert seit: 21.08.10 ![]() Likes: 10 | Zitat:
Code: private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
MessageBox.Show("Fertig");
} | |
| | |
| | #5 (permalink) |
| Senior Member Themenstarter | 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? |
| | |
| | #6 (permalink) | |
| Registriert seit: 21.08.10 ![]() Likes: 10 | Zitat:
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);
} | |
| | |
| | #7 (permalink) |
| Senior Member Themenstarter | so, hab also endlich geschafft :> Der bw war nur falsch deklariert shameHabe 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_RunWorkerComplet ed); das stoppen funktioniert allerdings nicht, was mache ich falsch? http://msdn.microsoft.com/de-de/libr...8VS.95%29.aspx |
| | |
| | #8 (permalink) | ||
| Registriert seit: 21.08.10 ![]() Likes: 10 | Zitat:
Der Handler wird vom Worker gerufen, wenn du RunWorkerAsync() ausführst. Zitat:
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 | ||
| | |
| | #9 (permalink) |
| Senior Member Themenstarter | 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... |
| | |
| | #10 (permalink) | |
| Registriert seit: 21.08.10 ![]() Likes: 10 | Zitat:
Das ist allerdings in Java implementiert, musst es entweder selbst portieren, oder du erweiterst es ... | |
| | |
![]() |
| - Anzeige - | |
| |
| Themen-Optionen | |
| Ansicht | |
| |