1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
/// <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();
}
}
|