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