Announcement

Collapse
No announcement yet.

BackgroundWorker macht eine Pause von bis zu 20 Sekunden

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

  • BackgroundWorker macht eine Pause von bis zu 20 Sekunden

    Hallo Zusammen,

    ich habe wieder ein Verständnisproblem mit dem Backgroundworker (BW im folgenden). Ich benutze VS 2015 Community, Net 4.5.1, Windows7

    Ich starte einen BW der auch am Anfang alles so erledigt wie er es soll, allerdings, wenn er in eine nächste Methode springt, dann geht manchmal bis zu 20 Sekunden nichts und dann macht er weiter.

    Ich lese Daten aus einem DataSet (DataTables) aus und setze die einzelnen Zeilen in ein Format, das ist "eigentlich" alles.

    Hier der Code-Ausschnitt des BW
    [highlight=csharp]
    private BackgroundWorker _work;

    .....
    private void InitBackgroundworker()
    {
    BgwSbeatBereitstellung = new BackgroundWorker();

    BgwSbeatBereitstellung.WorkerReportsProgress = true;
    BgwSbeatBereitstellung.WorkerSupportsCancellation = true;

    BgwSbeatBereitstellung.DoWork += BgwSbeatBereitstellung_DoWork;
    BgwSbeatBereitstellung.ProgressChanged += BgwSbeatBereitstellung_ProgressChanged;
    BgwSbeatBereitstellung.RunWorkerCompleted += BgwSbeatBereitstellung_RunWorkerCompleted;

    BgwSbeatBereitstellung.RunWorkerAsync();
    }
    private void BgwSbeatBereitstellung_DoWork(object sender, DoWorkEventArgs e)
    {
    _work = sender as BackgroundWorker;

    if (BgwSbeatBereitstellung.CancellationPending)
    {
    e.Cancel = true;
    }
    else
    {
    try
    {
    //Vorbereitungen vor dem Schreiben
    DateienErstellen();
    }
    catch (Exception ex)
    {
    throw new Exception("Fehler im Importieren von Daten" + ex.Message + " " + ex.StackTrace);
    }
    e.Cancel = true;
    }
    }

    private void BgwSbeatBereitstellung_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
    ONSbeatDatenEvent(_sbbe);
    }

    private void BgwSbeatBereitstellung_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
    if (e.Cancelled == true)
    {
    _sbbe = new SbeatBereitstellungDatenEvent("Bereitstellung beendet", _anzahlBearbeiteteDatensaetze, _anzahlFehler);
    }
    else if (e.Error != null)
    {
    _sbbe = new SbeatBereitstellungDatenEvent("Fehler im Thread aufgetaucht", _anzahlBearbeiteteDatensaetze, _anzahlFehler);
    }
    else
    {
    _sbbe = new SbeatBereitstellungDatenEvent("Vorgang abgebrochen", _anzahlBearbeiteteDatensaetze, _anzahlFehler);
    }

    ONSbeatDatenEventEnde(_sbbe);
    }



    ...
    [/highlight]

    Hier der Code-Ausschnitt der Verarbeitung:
    [highlight=csharp]
    private void DateienErstellen()
    {
    string doException = "Vorbereitung(work)";
    try
    {
    _ifZaehler = 0;

    Vorbereitungen();

    doException = "ErstelleStudentendaten(work)";
    ErstelleStudentendaten(); //===>>>> Diese Methode wird noch korrekt durchgeführt
    //=====>>>>>> wenn er fertig ist, dann kommt die Pause

    doException = "ErstelleStudienleistungsdaten(work)";
    ErstelleStudienleistungsdaten(); //====>>>>> dann macht er wieder korrekt weiter
    //=====>>>>>> wenn er fertig ist, dann kommt die Pause
    //**usw...
    doException = "ErstelleStudentenidentifikationsdaten(work)";
    ErstelleStudentenidentifikationsdaten();

    doException = "ErstelleHochschulzugangsberechtigungsgruppen(work )";
    ErstelleHochschulzugangsberechtigungsgruppen();
    }
    catch (Exception ex)
    {
    Logging.Log lg = new Logging.Log();
    lg.SetzeEigenschaften();
    lg.SchreibeLog("Fehler in Bereitstellung:\r\n" + doException);
    }
    }

    ...

    private void ErstelleStudentendaten() //IST IN JEDER FUNKTION GLEICH, Diese dient als Beispiel
    {
    _spezifikationenListe = new List<string>();

    bool b = SbeatDictSpezifikation.TryGetValue("Studentendaten ", out _spezifikationenListe);

    try
    {
    //Daten aus entsprechender Datei(en) zusammensetzen
    DataTable dt = GesamtDaten.Tables[_csvDateienErstellen.TabelleErmitteln(_spezifikati onenListe[0])];
    tabellenName = dt.TableName;

    AufbauDateien(dt, _spezifikationenListe.Count, _spezifikationenListe);

    //Daten schreiben
    SchreibeDatenInDatei(_csvZeilen, 0);
    }
    catch (Exception ex)
    {
    string s = string.Format("Fehler in SbeatBereitstellung.cs - ErstelleStudentendaten.\r\n{0}\r\n{1}", ex.Message, ex.StackTrace);
    new ShowMessages.Messages().ShowMessage(s, "Fehler", ShowMessages.Enumeration.EnumButton.OK, ShowMessages.Enumeration.EnumIcon.Error);
    }
    }

    ...
    private void AufbauDateien(DataTable dt, int spezifikationCount, List<string> spezifikationDaten)
    {
    _csvZeilen.Clear();

    for (int rowIndex = 0; rowIndex < dt.Rows.Count; rowIndex++)
    {
    zeilenZahl = rowIndex;

    Zeilenzusammenstellung(dt, rowIndex, spezifikationCount, spezifikationDaten);

    if (_anzahlBearbeiteteDatensaetze > _ifZaehler)
    {
    _work.ReportProgress(1);
    System.Threading.Thread.Sleep(1);

    _ifZaehler = _anzahlBearbeiteteDatensaetze + 9;
    }
    }
    }

    private void Zeilenzusammenstellung(DataTable dt, int rowIndex, int spezifikationCount, List<string> spezifikationDaten)
    {
    if (_csvDateienErstellen.PruefeTabellendaten(dt, rowIndex, spezifikationCount))
    {
    zeile = _csvDateienErstellen.SetzeZeileZusammen(GesamtDate n, dt, spezifikationDaten, rowIndex);
    _csvZeilen.Add(zeile);

    string pfad = @"C:\Temp\sbeat_zeilen.txt";
    _textverarbeitung.SchreibeReineTextDatei(pfad, dt.TableName + "---" + zeile + "\r\n", true);
    }

    ++_anzahlBearbeiteteDatensaetze;

    _sbbe = new SbeatBereitstellungDatenEvent("Studentendaten", _anzahlBearbeiteteDatensaetze, _anzahlFehler);
    }
    [/highlight]

    Hat von Euch jemand eine Idee, wie ich das optimieren könnte oder wo ich meinen Gedankenfehler habe?

    Benötigt Ihr noch weitere Informationen?

    Vielen Dank für Eure Unterstützung.

    Viele Grüße

    Lerando

  • #2
    Meine Idee wäre vielleicht dass aktuell einfach kein Thread aus dem Threadpool verfügbar ist und er auf einen Thread wartet. Ich weiss nicht wieviel Threading Du sonst noch in Deiner Anwendung hast, aber Du kannst ja mal schauen wie Dein Threadpool eingestellt ist und wie viele andere Threads parallel laufen könnten

    Comment


    • #3
      Originally posted by fanderlf View Post
      Meine Idee wäre vielleicht dass aktuell einfach kein Thread aus dem Threadpool verfügbar ist und er auf einen Thread wartet. Ich weiss nicht wieviel Threading Du sonst noch in Deiner Anwendung hast, aber Du kannst ja mal schauen wie Dein Threadpool eingestellt ist und wie viele andere Threads parallel laufen könnten
      Sorry, war die letzten Tag Krank und dabei ist mir die Lösung gekommen.
      Ich habe mal wieder den Wald vor lauter Bäumen nicht gesehen.

      Es liegt daran::

      //Daten schreiben SchreibeDatenInDatei(_csvZeilen, 0);


      Ich habe vergessen das Schreiben in den BW aufzunehmen. Hier erledige ich noch ein paar Prüfungen beim Schreiben der Daten. Leider sind diese nicht mit in den BW aufgenommen worden.

      Sorry für diesen Anfänger-Fehler.

      Vielen Dank an alle.

      Comment

      Working...
      X