In einem BackgroundWorker einen Treeview aufbauen / populate

In .NET 2.0 ist das Arbeiten mit Threads dank des Backgroundworkers deutlich einfacher geworden. Heute Abend habe ich mich mal damit beschäftigt in einem Backgroundworker einen Treeview zu füllen. Der Zugriff auf ein Control in der Methode DoWork() ist nämlich nicht möglich, aber es gibt einen Trick, dieses zu lösen.

Zunächst einmal die Basics um einen Backgroundworker bereitzustellen:

this.backgroundworker = new BackgroundWorker();
this.backgroundworker.WorkerReportsProgress = true;
this.backgroundworker.DoWork += new DoWorkEventHandler(backgroundworker_DoWork);
this.backgroundworker.ProgressChanged += new ProgressChangedEventHandler(backgroundworker_ProgressChanged);
this.backgroundworker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundworker_RunWorkerCompleted);

Wichtig dabei ist lediglich das Event ProgressChanged zu implementieren und die Property WorkerReportsProgress auf "true" zu setzen. Bis hier noch nicht wirklich aufregend....auch der Auruf mit

this.backgroundworker.RunWorkerAsync();

ist wie gewohnt.

In der Methode DoWork() kommt dann aber der Trick...

void backgroundworker_DoWork(object sender, DoWorkEventArgs e)
{

   TreeNode treenode= new TreeNode(); 
   treenode.Text = 'name';
   this.backgroundworker.ReportProgress(0, treenode);
}

Hier jetzt einfach mal so viel Vorstellungskraft aufbringen als würde DoWork() eine Schleife, Datenbankabfrage oder ähnliches durchführen, die viel Zeit in Anspruch nimmt. Die Möglichkeit eine Fortschritt zu Reporten kann man nun nutzen um ein Object an eine Form weiterzugeben. Die Implementierung der Methode/Event ProgessChanged könnte dann so aussehen:

void backgroundworker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.tvNavigator.BeginUpdate();
this.tvNavigator.Nodes.Clear();
this.tvNavigator.Nodes.Add((TreeNode)e.UserState);
this.tvNavigator.EndUpdate();
}

Mit diesem Trick ist es nun möglich einen TreeView asyncron zu füllen....

Kommentare (1) -

Uwe Keim
10.07.2006 18:16:38 #

Wie sieht's denn da mit der Performance aus? Diese Delegates sollen ja nicht sooooo schnell sein.

Ist das in der Praxis zu spüren?

Kommentar schreiben