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: 1551 | Anzahl registrierter User: 1841 | Besucher online: 99
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)

Control aus anderen Threads aktualisieren


Autor: Stefan Knoll
Sprache: C#
Bewertung:
9.19 (5 votes)
Anzahl der Aufrufe: 31514
  
Kick it on dotnet-kicks.de  

Beschreibung:

Jeder der schon mal mit Threads gearbeitet hat kennt das Problem: Eine länger dauernde Berechnung wird in einen Thread ausgelagert und natürlich soll der Benutzer regelmäßig über den Fortgang der Berechnung informiert werden. Das geht aber nicht aus dem Arbeitsthread, da Controls nur über den eigenen UI-Thread heraus aktualisiert werden können.
Eine Alternative ist der Backroundworker aus dem .NET-Framework. Der erhöht aber nicht gerade die Code-Lesbarkeit und zerstückelt eine zusammenhängenden Codeblock in mehrere Einzelfunktionen.
Es gibt dafür jedoch auch eine elegante Lösung:


Abgelegt unter: delegates, InvokeRequired, threadübergreifend, invoke, CrossThreadException, Multithreading, backroundworker, illegal cross calls, thread, threads, UI, Threadsicher, delegate, backgroundworker, anonym, anonyme.



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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsApplication8
{
  static class Program
  {
    [STAThread]
    static void Main()
    {
      Application.Run(new TheForm());
    }

    public class TheForm : Form
    {
      Label label1;
      Button button1;

      public TheForm()
      {
        label1 = new System.Windows.Forms.Label();
        label1.Location = new System.Drawing.Point(102, 14);
        label1.Size = new System.Drawing.Size(130, 13);

        button1 = new System.Windows.Forms.Button();
        button1.Location = new System.Drawing.Point(12, 9);
        button1.Size = new System.Drawing.Size(75, 23);
        button1.Text = "Start";
        button1.Click += new System.EventHandler(this.button1_Click);
        Controls.AddRange(new Control[] { label1, button1 });
      }

      private void button1_Click(object sender, EventArgs e)
      {
        // Nimmt sich ein Thread und ruft damit DoIt auf
        System.Threading.ThreadPool.QueueUserWorkItem(DoIt);
      }

      private void DoIt(object dummy)
      {
        int i = 1;
        bool Cancel = false;

        while (Cancel == false)
        {
          // Zu Demozwecken immer 1 Sekunde Pause
          System.Threading.Thread.Sleep(1000);

          // Dies ist sogenannter generischer Delegate,
          // innerhalb des Blocks vollen Zugriff auf die
          // UI zuläßt
          MethodInvoker LabelUpdate = delegate
          {
            // Innerhalb dieses Blocks können Controls
            // und Forms angesprochen werden, neue Fenster
            // erzeugt werden etc....
            label1.Text = i.ToString() + " Durchläufe absolviert";
          };

          Invoke(LabelUpdate);

          if (i % 5 == 0)
          {
            MethodInvoker QuestionDelegate = delegate
            {
              // Sogar Rückfragen sind möglich
              if (MessageBox.Show("Noch eine Runde ?", "Frage", MessageBoxButtons.YesNo) == DialogResult.No)
                Cancel = true;
            };
            Invoke(QuestionDelegate);
          }
          i++;
        }
      }
    }
  }
}
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.)

knoyxz schrieb am:  19.11.2008 23:32:01

Dein Snippet hat mir soeben einen leicht verständlichen Einstieg
ins Thema Threads ermöglicht!
Tausend DANK :-)

Besonders den MethodInvoker kann ich sehr gut gebrauchen.

knoxyz
derjaeckel schrieb am:  04.06.2009 10:41:38

Hat mir auch super geholfen... vielen Dank!!!
regalis schrieb am:  26.03.2010 10:23:09

Ich glaub ich muss meine Anwendung komplett umbauen...so einfach und übersichtlich sieht sie nämlich nicht aus :D
Danke sehr! Bitte noch mehr so leicht verständliche und gebräuchliche Snippets ;)
armintelker schrieb am:  22.08.2010 00:42:56

MethodInvoker: Macht einem das leben um einiges leichter :) danke.
NoBadCode schrieb am:  16.04.2011 02:36:58

Danke, das hat mir wirklich sehr geholfen, weiter so.


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