Feedback

C# - Threadsicheres Zuweisen von Control-Eigenschaften

Veröffentlicht von am 16.04.2008
(6 Bewertungen)
Wenn aus einem anderen Thread eine Eigenschaft in einem Form-Control geändert werden soll, so muss man mit Callbacks und Invoke arbeiten.
Mit diesem generischen Delegate und der dazugehörigen Funktion, kann man eine Menge Code sparen.
GFU-Schulungen  [Anzeige]

VB.NET 2017/2015/2013 Aufbau

Nach dieser Schulung können Sie mittels objektorientierter Modelle in VB.NET 2017/2015/2013 wiederverwendbare Elemente eigenständig erstellen.

C# 2017/2015/2013 Grundlagen

Nach Abschluss des Kurses sind Ihnen die Datentypen und Klassenbibliotheken von C# bekannt. Außerdem sind Sie in der Lage, mit Variablen umzugehen und deren Typen zu konvertieren. Sie definieren Namespaces und setzen diese ein, Sie erstellen eigene Klassen  und bauen Trouble Shooting ein.

private delegate void SetPropertyValueCallback<ControlType, PropertyType>(ControlType control, string propertyName, PropertyType value) where ControlType : Control;

private void SetPropertyThreadSafe<ControlType, PropertyType>(ControlType control, string propertyName, PropertyType value) where ControlType : Control
{
	if (control.InvokeRequired)
	{
		SetPropertyValueCallback<ControlType, PropertyType> cb = new SetPropertyValueCallback<ControlType, PropertyType>(SetPropertyThreadSafe);
		control.Invoke(cb, new object[]{ control, propertyName, value });
	}
	else
	{
		System.Reflection.PropertyInfo property = control.GetType().GetProperty(propertyName);
		property.SetValue(control, value, null);
	}
}

//Anwendung
SetPropertyThreadSafe<ProgressBar, int>(pbState, "Value", (int)syncState.PercentFinished * 100); 
SetPropertyThreadSafe<Label, string>(lblState, "Text", syncMessage);

3 Kommentare zum Snippet

Tim Hartwig schrieb am 16.04.2008:
Sehr schön, kann ich gebrauchen. Danke!
Ilja Smorguner schrieb am 06.05.2008:
Sehr gut!!! Danke!
Rainer Hilmer schrieb am 25.08.2008:
Perfekt. Die Anwendung geht sogar noch einfacher:
SetControlProperty(pbState, "Value", (int)syncState.PercentFinished);
SetControlProperty(lblState, "Text", syncState.SyncMessage);
 

Logge dich ein, um hier zu kommentieren!