Thread.Invoke() Call

Christian Kusmanow

Erfahrenes Mitglied
Hallo FIAE's!

Ich hab ein kleines Form welches via Interface bestimmte Werte von dem Hauptform anzeigt. In dem Form befindet sich eine GroupBox und darinn ein TreeView.

Dieses kleine Form hat auch ein Interface damit ich vom Hauptform aus veranlassen kann, das der TreeView neu gezeichnet wird, wenn sich was verändert hat.
Das Neuzeichen lasse ich in einem Thread laufen damit das Hauptform nicht warten muss bis das kleine Form damit fertig ist.
(Der Thread startet in dem kleinem Form)

In der Methode, die in dem Thread ausgeführt wird, veranlasse ich das der TreeView nicht neu gezeichnet wird:
Code:
private delegate void dUpdateTreeView();

gbxView.Invoke( new dUpdateTreeView( tvwDebugWindow.BeginUpdate ));
dann wird die Root-Node gefüllt und wenn es fertig ist, soll sich der TreeView wieder aktualisieren:
Code:
gbxView.Invoke( new dUpdateTreeView( tvwDebugWindow.EndUpdate ));
gbxView.Invoke( new dUpdateTreeView( tvwDebugWindow.ExpandAll ));
Und genau hier bekomm ich eine InvalidOperationException:
InvalidOperationException hat gesagt.:
An unhandled exception of type 'System.InvalidOperationException' occurred in system.windows.forms.dll

Additional information: The action being performed on this control is being called from the wrong thread. You must marshal to the correct thread using Control.Invoke or Control.BeginInvoke to perform this action.

Versteh ich jetzt nicht. Ich mach das sonst immer so und bekomm keine Zugriffsverletzung.

Was hab ich da blos falsch gemacht?

MfG cosmo
 
Zuletzt bearbeitet:
Damit hatte ich auch schon zu kämpfen.
Code:
If txtBox.InvokeRequired Then
    txtBox.Invoke(AddressOf MeineMethode)
    Exit Sub
End If
txtBox.Text = "Hallo Welt"
Es ist tatsächlich möglich, dass hier eine InvalidOperationException geworfen wird, obwohl das eigentlich unmöglich sein sollte. Ich habe mal gelesen, dass es unter bestimmten Umständen für das .NET Framework unmöglich ist, herauszufinden ob ein Control zu diesem oder jenem Thread gehört weil das Windows Handle noch nicht verfügbar ist. Ich konnte dieses Problem bis heute noch nicht beseitigen.
 
Hi Sunray!

Danker für den Tip!

Ich hab die Ursache für mein Problem gefunden.
Nach BeginUpdate hab ich die Nodes mit Clear() gelöscht.
Hab vergessen die Zeile
Code:
tvwDebugWindow.Nodes.AddRange( tnaRoot );
noch vor EndUpdate() auszuführen.
Ich Hammel. Sorry es war schon Freitag.

Das Phenomen, so wie Du es beschrieben hast, trat aber zwischdurch auch auf.
Es war aber gestern so spät das ich mich nicht mehr erinnern kann, wie da die Konstellation der Methoden aufrufe war.
Als ich weiter an dem Ablauf rumgehackt hab, war es aber wieder verschwunden.

Mit dieser Konstellation hat es geklappt:
Code:
public void RefreshView( ){

	if ( WorkertThread != null && WorkertThread.IsAlive ){
		timer.Enabled = true; // Der Timer aktualisiert nochmal wenn der Thread fertig ist
		return;
	}
	WorkertThread = new Thread( new ThreadStart( RefreshTreeView )); 
	WorkertThread.Start();
}
public void RefreshTreeView( ){
			
	FillRootNode(); // Darin wird die RootNode gefüllt

	if ( tnaRoot != null )
		this.Invoke( new dUpdateTreeView( AddNodeCollection ));
}
private void AddNodeCollection(){

	tvwDebugWindow.Nodes.Clear();
	tvwDebugWindow.BeginUpdate()
	tvwDebugWindow.Nodes.AddRange( tnaRoot );
	tvwDebugWindow.EndUpdate();
	tvwDebugWindow.ExpandAll();
}

MfG cosmo
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück