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
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
Comment