Vermutlich gibt es hierzu schon tausend beiträge, jedoch haben mir all diese beiträge noch nicht weitergeholfen.
Zum Thema wie poste ich richtig:
Gerne hätte ich in meinen Büchern gelesen wie dieses Problem zu beheben ist, jedoch gibt es zum backgroundworker nicht mal nen einzeiler dazu.
und zwar,
mein programm sortiert meine mp3's in entsprechende Ordner.
Dies klappt soweit, jedoch bekomme ich es einfach nicht hin, dass erfasst wird, wie weit der Fortschritt ist.
Meine Versuche scheitern damit, dass dann die Fehlermeldung kommt "Es sei threadübergreifend" bzw.
wenn ich diesen fehler behoben habe, passiert gar nichts in richtung progressbar änderung.
ich habe es auch schon mit
private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressbar1.value = AnzahlDerSortiertenLieder;
}
versucht, jedoch funktionierte dies auch nicht, obwohl ich die eigenschaft workreportsprocess auf true gesetzt habe.
Allerdings könnte mein Problem hiermit zusammenhängen
ReportProgress
ich weiß jedoch nicht wie ich dies verwenden sollte und wofür das nützlich ist.
wenn ich diesen fehler behoben habe, passiert gar nichts in richtung progressbar änderung.
Wie behebst du diesen Fehler ?
Du kennst Invoke und Invoke Required?
Normalerweise kommt hier gleich ein Aufpasser und postet "Warum blockiert mein Gui" aber vermutlich stimmt die Uhrzeit dafür nicht.
Hallo zusammen,
... aber vermutlich stimmt die Uhrzeit dafür nicht.
Doch, die stimmt fast immer 😃
Guck dir mal den folgenden FAQ Eintrag an: [FAQ] Warum blockiert mein GUI? und [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)
Setze mal einen Breakpoint auf diese Zeile (progressbar1.value = AnzahlDerSortiertenLieder;) um zu sehen ob dein Programm überhaupt soweit kommt.
Rufst du überhaupt die ReportProgress Methode auf?
Noch ein kleiner Wink mit dem Zaunpfahl: Achte darauf dass du die ReportProgress-Methode nicht zu oft aufrufst.
Wenn du das nämlich nach jedem Lied machst, dann hängt sich die GUI ziemlich sicher halb auf und du siehst keinen Fortschritt.
Mach das besser zyklisch oder alle x Lieder einmal.
Gruss
Michael
Wie wäre es, wenn du uns einfach mal die 3 berühmten BackgroundWorker-Events zeigst? Kürze einfach die irrelevanten IO-Stellen der mp3s heraus.
Die ReportProgress methode rufe ich nicht auf,
wenn mir jemand kurz erklären könnte wofür diese steht,
und wie ich sie verwende wäre mir sehr geolfen.
private void backgroundWorker1_ProgressChanged(object sender,ProgressChangedEventArgs e)
{
progressBar2.Value = AnzahlDerSortiertenLieder;
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show(checkedListBox1.Items.Count + "wurden sortiert.");
}
Die Backgroundworker_DoWork methode erledigt ihre Aufgaben reibunslos, jedoch die anderen Beiden Methoden nicht....
Bitte die CSHARP-Tags für den Code verwenden, damit dieser besser leserlich wird.
Danke
Hallo,
Methoden bzw. Klassen bitte immer vorher in der MSDN nachschlagen denn dort sind diese schön erklärt 😃
Guckst du hier: MSDN Backgroundworker - ReportProgress Methode
Diese Methode löst das Event ProgressChanged aus und du kannst die Prozentanzahl des Fortschrittes mitgeben.
Setze mal testweise einen Breakpoint in deinen Methoden dann siehst du dass diese überhaupt nicht aufgerufen werden.
Wie gesagt ist es auch noch wichtig dass du das Event nicht zu oft auslöst, weil das könnte die GUI blockieren
Gruss
Michael
Hallo,
um Michl's Aussage auf n Punkt zu bringen:
Du must die ReportProgress-Methode schon selbst aufrufen, wenn du das passende Event dazu nutzen willst.
Stell dir die Situation doch einfach mal vor: Woher sollte der Backgroundworker wissen, wieviel seiner anstehenden Arbeit erledigt ist? Das musst du dann schon selbst lösen.
Sicherlich wirst du im Backgroundworker-Thread irgendeine Art von Schleife verwenden. Dann könntest du zum Beispiel vorher versuchen herrauszufinden wieviele Schleifendurchläufe durchgeführt werden. Diese Anzahl kannst du dann am Ende jedes Durchlaufs mit der Anzahl der Durchläufe abgleichen und schon hast du deinen "Fortschritt", den du per ReportProgress an den GUI-Thread übergeben kannst.
Gruß dev