Wenn man aus einem Background Thread mit der UI einer Windows Forms anwendung kommunizieren (Werte ändern) möchte, muss man dies mittels Invoke machen, nachfolgendes Snippet zeigt wie man sich schnell eine einfache Methode schreiben kann die selbst entscheidet ob ein Invoke von Nöten ist oder nicht.
/// <summary>
/// Diese Methode wird von einem Background Thread (nicht UI Thread) aufgerufen
/// </summary>
/// <param name="max">Maximale Anzahl der Durchläufe</param>
private void BackgroundThreadAction(int max)
{
if (max < 0)
{
InvokeIfRequired(this.textBoxStatus, (MethodInvoker)delegate()
{
this.textBoxStatus.Text = "max value must be greater than zero";
});
return;
}
for (int i = 0; i < max; i++)
{
InvokeIfRequired(this.textBoxStatus, (MethodInvoker)delegate()
{
this.textBoxStatus.Text = String.Format("Processing value {0}", i);
});
Thread.Sleep(10);
}
}
/// <summary>
/// Methode die die UI Interaktionen durchführt.
/// </summary>
/// <param name="target">Control welches geändert wird, werden mehrere Controls geändert muss hier das Parent Control übergeben werden</param>
/// <param name="methodToInvoke">der Delegate der ausgeführt werden soll (UI Aktionen)</param>
private void InvokeIfRequired( Control target,Delegate methodToInvoke)
{
/* Mit Hilfe von InvokeRequired wird geprüft ob der Aufruf direkt an die UI gehen kann oder
* ob ein Invokeing hier von Nöten ist
*/
if (target.InvokeRequired)
{
// Das Control muss per Invoke geändert werden, weil der aufruf aus einem Backgroundthread kommt
target.Invoke(methodToInvoke);
}
else
{
// Die Änderung an der UI kann direkt aufgerufen werden.
methodToInvoke.DynamicInvoke();
}
}
4 Kommentare zum Snippet