Announcement

Collapse
No announcement yet.

BackgroundWorker (schon wieder)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • BackgroundWorker (schon wieder)

    Hallo Zusammen,

    leider blicke ich es mit dem Backgroundworker wieder nicht. Uhrzeiten und Zähler mit Zeitschleifen usw. geht bei mir sehr gut. Allerdings nicht, wenn ich nur einen string aus einer Klasse an die Andere weitergeben möchte.
    Nach dem ich viele Foren und Beispiel im Internet besucht habe, komme ich hier doch nicht weiter. Mein Test funktioniert nicht. Wahrscheinlich sehe ich den Wald vor lauter Bäumen nicht mehr.

    Im Anhang ist die Testumgebung.

    Daten:
    VS 2015 Community. - .NET4.5.2 - WPF

    Code-Ausschnitt MainWindow
    [highlight=csharp]
    ...
    private DatenLaden dL;
    private readonly string _pfad = @"C:\Temp\testdaten.txt";
    private readonly int _anzahlDatensaetze = 120000;
    ....

    private void Vorgaben()
    {
    dL = new DatenLaden();
    dL.BearbeiteteZeileEvent += DL_BearbeiteteZeileEvent;
    }

    ....
    private void DL_BearbeiteteZeileEvent(object sender, string e)
    {
    LblZeilenanzeige.Content = e.ToString();
    LblZeilenanzeige.UpdateLayout();
    }
    ....

    private void BtnDatenLaden_Click(object sender, RoutedEventArgs e)
    {
    DataSet ds = new DataSet("DS");
    //Pfad
    dL.DatenImportieren(_pfad);
    //Importieren
    ds = dL.ImportierteDaten.Copy();
    //Anzeige
    DaGrDatenanzeige.ItemsSource = ds.Tables[0].DefaultView;
    }

    [/highlight]

    Code-Ausschnitt DatenLaden:
    [highlight=csharp]
    ....
    private bool _importierung;
    private BackgroundWorker _bGw;
    ....
    #region Event
    public event EventHandler<string> BearbeiteteZeileEvent;
    private void ONBearbeiteteZeileEvent(string bearbeiteteZeile)
    {
    EventHandler<string> handler = BearbeiteteZeileEvent;
    if (handler != null) handler(this, bearbeiteteZeile);
    }
    #endregion
    ....

    private void InitialisiereBackgroundWorker()
    {
    _bGw.RunWorkerCompleted += _bGw_RunWorkerCompleted;
    _bGw.ProgressChanged += _bGw_ProgressChanged;
    _bGw.DoWork += _bGw_DoWork;

    _bGw.WorkerReportsProgress = true;
    _bGw.WorkerSupportsCancellation = true;
    }
    ....

    private void _bGw_DoWork(object sender, DoWorkEventArgs e)
    {
    BackgroundWorker worker = sender as BackgroundWorker;
    while (_importierung)
    {
    if (worker.CancellationPending == true) e.Cancel = true;
    else
    {
    worker.ReportProgress(1);
    }
    }
    }

    private void _bGw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
    ONBearbeiteteZeileEvent(Zeile);
    }

    private void _bGw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
    if (e.Cancelled == true) ONBearbeiteteZeileEvent("Canceld!");
    else if (e.Error != null) ONBearbeiteteZeileEvent("Error: " + e.Error.Message);
    else ONBearbeiteteZeileEvent("Done!");
    }
    ....
    private void Import()
    {
    string zeile = "";
    StreamReader sr = new StreamReader(_pfad);
    //Daten aus Datei einlesen
    while (!sr.EndOfStream)
    {
    zeile = sr.ReadLine();
    DatenInTabelle(zeile);

    Zeile = zeile;
    }
    _importierung = false;
    }....
    [/highlight]
    (Im Anhang etwas übersichtlicher dargestellt)

    Ich möchte einfach nur, dass das Label im MainWindow über den Event die Zeile anzeigt, die gerade genutzt wird. Muss ja nicht unbedingt gelesen werden können.

    Vielen Dank für Eure Unterstützung und Hilfe

    PS: Habe einen Button zum erzeugen der entsprechenden Textdatei im Beispiel. Schreibrechte auf C:\Temp müssen vorhanden sein.
    Attached Files
    Zuletzt editiert von Lerando; 03.09.2015, 16:03.

  • #2
    Dein DoWork macht aber nix? Du solltest da drin dann auch den Import erledigen.
    Die Schleife in Import ist so geschrieben das die nicht unterbrechbar ist. Der Hauptthread zeichnet auch die UI und solange Import läuft kommt die dazu nie. Ich habe deinen Code jetzt nicht genau studiert ich vermute aber auch das bereits ReportProgress hängen wird da der Event ja auch im Hauptthread ausgeführt (er wird reinsynchronisiert) wird und da der nicht unterbrechbar ist wird der warten müssen bis der Hauptthread mal wieder verfügbar ist also irgendwann nachdem die Import Methode durch ist.

    Damit der Haupthread responsiv bleibt mußt du alle Aufgaben die (potentiell) langlaufend (und eher nicht unterbrechbar sind) sind in andere Threads auslagern z.B in einen Backgroundworker. Nicht aber die Hauptaufgabe im Hauptthread machen und von einem anderen Thread aus nur beobachten. Das bringt null.

    Comment


    • #3
      Originally posted by Ralf Jansen View Post
      Dein DoWork macht aber nix? Du solltest da drin dann auch den Import erledigen.
      Die Schleife in Import ist so geschrieben das die nicht unterbrechbar ist. Der Hauptthread zeichnet auch die UI und solange Import läuft kommt die dazu nie. Ich habe deinen Code jetzt nicht genau studiert ich vermute aber auch das bereits ReportProgress hängen wird da der Event ja auch im Hauptthread ausgeführt (er wird reinsynchronisiert) wird und da der nicht unterbrechbar ist wird der warten müssen bis der Hauptthread mal wieder verfügbar ist also irgendwann nachdem die Import Methode durch ist.

      Damit der Haupthread responsiv bleibt mußt du alle Aufgaben die (potentiell) langlaufend (und eher nicht unterbrechbar sind) sind in andere Threads auslagern z.B in einen Backgroundworker. Nicht aber die Hauptaufgabe im Hauptthread machen und von einem anderen Thread aus nur beobachten. Das bringt null.
      Vielen Dank für die Antwort. Irgendwie ist beim Backgroundworker meine Denkweise blockiert. Ich werde versuchen es umzusetzten. Es ist eigentlich nicht das erste mal, dass ich so etwas code aber beim Backgroundworker bleibe ich jedesmal hängen.

      Falls Du etwas Zeit erübrigst und vielleicht meinen Beispielcode anpasst (sofern es zeitlich möglich ist), dann hätten hier andere gleich die Möglichkeit dieses als Beispiel herzunehmen. In anderen Foren bin ich auf das gleiche Problem schon mehrmals gestossen als ich (immer wieder) nach diesem Problem gesucht habe.

      Nochmals, vielen Dank.

      Comment


      • #4
        Falls jemand für das Beispiel eine Lösung möchte, bitte melden, dann poste ich Sie.
        Ansonsten schließen.

        Danke an alle.

        Comment

        Working...
        X