C-Sharp - Backgroundworker - Rückgabe - Verständnis
Hallo zusammen
Ich arbeite an einer grösseren Applikation welche an einer bestimmten Stelle, eine zweite Form öffnet in der ein Progressbar & ein Backgroundworker untergebracht sind.
In dem Backgroundworker läuft ein grosser Code Brocken in der Zwischenzeit zählt der Progressbar immer mit. Soweit so okay! Dies funktioniert nun alles.
Dieser Backgroundworker sollte allerdings einen Data Table zurückgeben den ich daraufhin auch noch in die erste / Main form zurück geben will.
Zu diesem Thema lassen sich einige Beiträge im Internet finden und ich habe mich heute auch gut damit eingedeckt. Jedoch klappte keiner der Lösungsvorschläge.
Dies muss aber nicht unbedingt an den Lösungen liegen, ich selber bin auch noch nicht so erfahren und deshalb fehlt mir auch oft die benötigte Auffassungsgabe um
die Ansätze zu verstehen.
Mein Problem:
Ich bin Ratlos wie ich mein Table zurück geben kann, nachdem der Backgroundworker durchgelaufen ist.
Dazu müsste ich dies möglichst verständlich erklärt bekommen, da ich wie gesagt noch nicht so lange im business bin.
Frage:
Wie exportiere ich mein Data Table aus dem Backgroundworker?
Code:
Ich öffne die zweite Form mit einem "Form.ShowDialog();". Hierbei sind die Tables im "new Form event" die Tabellen die ich mitgebe.
Dies ist der Ganze Code der zweiten form, bzw der Form mit dem Backgroundworker:
Ich arbeite an einer grösseren Applikation welche an einer bestimmten Stelle, eine zweite Form öffnet in der ein Progressbar & ein Backgroundworker untergebracht sind.
In dem Backgroundworker läuft ein grosser Code Brocken in der Zwischenzeit zählt der Progressbar immer mit. Soweit so okay! Dies funktioniert nun alles.
Dieser Backgroundworker sollte allerdings einen Data Table zurückgeben den ich daraufhin auch noch in die erste / Main form zurück geben will.
Zu diesem Thema lassen sich einige Beiträge im Internet finden und ich habe mich heute auch gut damit eingedeckt. Jedoch klappte keiner der Lösungsvorschläge.
Dies muss aber nicht unbedingt an den Lösungen liegen, ich selber bin auch noch nicht so erfahren und deshalb fehlt mir auch oft die benötigte Auffassungsgabe um
die Ansätze zu verstehen.
Mein Problem:
Ich bin Ratlos wie ich mein Table zurück geben kann, nachdem der Backgroundworker durchgelaufen ist.
Dazu müsste ich dies möglichst verständlich erklärt bekommen, da ich wie gesagt noch nicht so lange im business bin.
Frage:
Wie exportiere ich mein Data Table aus dem Backgroundworker?
Code:
Ich öffne die zweite Form mit einem "Form.ShowDialog();". Hierbei sind die Tables im "new Form event" die Tabellen die ich mitgebe.
frm_WorkInProgress frmWIP = new frm_WorkInProgress(tblFilter, lstTables[2], lstTables[1]);
frmWIP.ShowDialog();
Dies ist der Ganze Code der zweiten form, bzw der Form mit dem Backgroundworker:
// Loading Components
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
// Namespace for the failed CI's form - Validator_Reloaded
namespace Validator_Reloaded
{
public partial class frm_WorkInProgress : Form
{
// Define the tables that get importet
DataTable tblCIs;
DataTable tblCIService;
DataTable tblServiceLists;
// Work in progress: Class
public frm_WorkInProgress(DataTable tblCIs, DataTable tblCIService, DataTable tblServiceLists)
{
InitializeComponent();
// set the new createt tables to the same tables
this.tblCIs = tblCIs;
this.tblCIService = tblCIService;
this.tblServiceLists = tblServiceLists;
}
// define a new variable for the finished percent
int percentFinished = 0;
// define datatables
DataTable tblCont = new DataTable();
DataTable tblServices = new DataTable();
DataTable tblFailedCIs = new DataTable();
// Create Dataviews
DataView dvFailedCIs = new DataView();
DataView dvCIService;
DataView dvServiceList;
// Create new Lists
List<List<string>> lstCIs = new List<List<string>>();
List<string> lstFailedCIs = new List<string>();
List<string> lstCIServices = new List<string>();
List<string> lstServices = new List<string>();
List<string> lstContent = new List<string>();
// Create a new Array
int arrColumnNr = { 0, 7, 9 };
// Load event
private void _03_Validator_Progress_Load(object sender, EventArgs e)
{
// fill the the dataviews with the table CI's & tbl Service Lists
dvCIService = new DataView(tblCIs);
dvServiceList = new DataView(tblServiceLists);
// foreach row in the CI table
foreach (DataRow row in tblCIs.Rows)
{
// set the lstContent as a new list
lstContent = new List<string>();
// foreach integer in the Column Array
foreach (int i in arrColumnNr)
{
// add a new row to the lstContent
lstContent.Add(row[i].ToString());
}
// add the list to the CI - list
lstCIs.Add(lstContent);
}
// define the maximum from the pgbFortschritt - progressbar | as the lstCIs Count
progressBar1.Maximum = lstCIs.Count;
System.Windows.Forms.Application.DoEvents();
// Start the Backkground Worker
worker.RunWorkerAsync(progressBar1.Value);
}
// the Do Work event for the worker
void worker_DoWork(object sender, DoWorkEventArgs e)
{
// foreach list in list CIs
foreach (List<string> list in lstCIs)
{
// Search the table for the current CI
dvCIService.RowFilter = "CI Like '" + list + "'";
// add the Dataview to a table
tblCont = dvCIService.ToTable();
// get a table with the Servicelist CIs
dvServiceList.RowFilter = String.Format("convert(Customer, 'System.String') Like '" + list[1].ToString() + "' AND convert(Model, 'System.String') Like '" + list[2].ToString() + "'");
tblServices = dvServiceList.ToTable();
// Set the two lists as new string Lists
lstCIServices = new List<string>();
lstServices = new List<string>();
//foreach row in in the table Content
foreach (DataRow row in tblCont.Rows)
{
// add the first item in the current row to the list CIServices
lstCIServices.Add(row[1].ToString());
}
// foreach row in the table Services
foreach (DataRow row in tblServices.Rows)
{
// add the 3rd item in the row to the List
lstServices.Add(row[3].ToString());
}
// If the lenght from the List CIServices not equal the Services List lenght
if (lstCIServices.Count != lstServices.Count)
{
// Add the CI to the failed CI list
lstFailedCIs.Add(list);
}
else
{
// Check if the lists arent equal
var a = lstCIServices.All(lstServices.Contains);
if (a == false)
{
// if it isn't equal ad dit to the Failed CI list
lstFailedCIs.Add(list);
}
}
// Add another point to the progressbar
percentFinished++;
worker.ReportProgress(percentFinished);
}
// Update the label with bonus information
lblAnzeige.Text = "Fertig stellen...";
// set the dvFailedCIs as New DataView
dvFailedCIs = new DataView(tblCIs);
// Make Sure the string is empty
string strCMD = "";
// Check if the list with the failed CI's isn't 0
if (lstFailedCIs.Count >= 1)
{
// Create a filter string for a Dataview rowfilter.
strCMD = strCMD + "(CI IN ('" + lstFailedCIs + "' ";
// add each item in the Failed CIs list into the strCMD
foreach(string i in lstFailedCIs)
{
strCMD = strCMD + ", '" + i + "'";
}
strCMD = strCMD + "))";
}
else
{
// else add 2 Points to the progressbar
percentFinished = percentFinished + 2;
}
// generate a datatable with the wrong CI string
dvFailedCIs.RowFilter = strCMD;
tblFailedCIs = dvFailedCIs.ToTable();
e.Result = tblFailedCIs;
}
// Update event for the worker
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
lblAnzeige.Text = percentFinished.ToString() + " / " + lstCIs.Count.ToString();
}
// Completet Event for Worker
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
DataTable tblTest = (DataTable)e.Result;
lblAnzeige.Text = "Completed!";
button1.Enabled = true;
}
// Klick event for the button
private void btn_Okay_Click(object sender, EventArgs e)
{
this.Close();
}
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 357261
Url: https://administrator.de/forum/c-sharp-backgroundworker-rueckgabe-verstaendnis-357261.html
Ausgedruckt am: 23.04.2025 um 01:04 Uhr
3 Kommentare
Neuester Kommentar
Du könntest einen Zwischenschritt einfügen.
exemplarisch:
Static ObsevableCollection DataTable... (Sorgt dafür, dass Änderungen in der Datatable automatisch aktualisiert werden)
Deine View auf diese verknüpfen (Spricht, die Aktualisierung in der ObservableCollection DataTable übernehmen)
Im BackGroundWorker im Bereich ProgessChanged einen Methode implemetieren die die Änderung in die ObservableCollection DataTable schreibt.
So funktionierts zumindest bei mir.
Das ganze wäre dann entsprechend dem MVVM (Model- View-View-Model)
Wie @emerics schon erwähnt hat müssen Methoden und Variablen außerhalb des BW deklariert sein um deine View außerhalb des BW zu aktualisieren.
Edit:
Habe gerade gesehen, dass du Forms verwendest. Ob du MVVM in Forms anwenden kannst bezweifle ich.
exemplarisch:
Static ObsevableCollection DataTable... (Sorgt dafür, dass Änderungen in der Datatable automatisch aktualisiert werden)
Deine View auf diese verknüpfen (Spricht, die Aktualisierung in der ObservableCollection DataTable übernehmen)
Im BackGroundWorker im Bereich ProgessChanged einen Methode implemetieren die die Änderung in die ObservableCollection DataTable schreibt.
So funktionierts zumindest bei mir.
Das ganze wäre dann entsprechend dem MVVM (Model- View-View-Model)
Wie @emerics schon erwähnt hat müssen Methoden und Variablen außerhalb des BW deklariert sein um deine View außerhalb des BW zu aktualisieren.
Edit:
Habe gerade gesehen, dass du Forms verwendest. Ob du MVVM in Forms anwenden kannst bezweifle ich.