Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1550 | Anzahl registrierter User: 1841 | Besucher online: 7
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Threadsichere GUI Änderungen


Autor: Thorsten Hans
Sprache: C#
Bewertung:
9.62 (3 votes)
Anzahl der Aufrufe: 13785
  
Kick it on dotnet-kicks.de  

Beschreibung:

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.

Abgelegt unter: Thread, Threadübergreifend, Freeze, Blockieren, UI, GUI, Background, Invoke, Delegate.



C#
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();

                
            }
        }
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Rainer Hilmer schrieb am:  09.12.2008 19:07:40

Siehe hierzu auch
http://dotnet-snippets.de/dns/threadsicheres-zuweisen-von-control-eigenschaften-SID829.aspx
Thorsten Hans schrieb am:  10.12.2008 10:52:39

Ich hab mir das Snippet gerade mal angesehen, ich finde allerdings dass dieser Weg der 'schönere' ist weil man so direkt mehrere Aktionen in dem anonymen Delegaten machen kann und nicht immer nur eine Property setzen kann :)
Rüdiger Vossel schrieb am:  10.12.2008 16:02:20

Siehe auch
"Asynchrones nachladen von Bildern in DataGridView" hier bei .Net-Snippet.de
:-)
Fabian Scholz schrieb am:  16.12.2009 13:56:23

Hallo,

kann mir jemand bitte mal das "Parent Control" erklären? Bei Google finde ich nichts gescheites bzw. ich kann damit nichts anfangen und bräuchte es aber dringend...

Danke schonmal!

P.S. Sehr gutes Snippet :D


schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.