Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Threading Problem

Empfohlene Antworten

Veröffentlicht

Hallo.

Ich möchte gerne eine Anwendung von mir erweitern. Dazu benötige ich mehrere Threads.

Aber ich scheitere schon ein einem Kleinen Thread:


        public Form1()

        {

            InitializeComponent();

        }


        private void button1_Click(object sender, EventArgs e)

        {

            Thread t = new Thread(new ThreadStart(ThreadProc));

            t.Start();

        }


        public void ThreadProc()

        {

            for (int i = 0; i < 100; i++)

            {

                progressBar1.Value = i;

                Thread.Sleep(100);

            }

        }

Ich habe eine Progressbar. Wenn ich die Value der Progressbar erhöhe mit einem Sleep, hängt sich die Anwendung so lange auf, bis die Schleife abgeschlossen ist. Desshalb will ich diese Aktion in ein Thread auslagern.

Leider klappt das nicht. Der Vorgang ist "Threadübergreifend". Was das genau bedeutet, weiss ich selbst nicht so genau.

Jedenfalls wäre es Super, wenn das klappen würde.

Das wäre ein guter Ansatz für mich, größere Aufgaben in Threads zu unterteilen.

Man darf in .NET nicht von jedem Thread auf Controls zugreifen!

Genauer gesagt: Nur von einem einzigen, dem GUI-Thread.

Zugriffe auf Controls muss man immer in den GUI-Thread auslagern. Dazu gibt es [begin]Invoke(Delegate). Je nach Szenario, ist es einfacher, den BackgrundWorker zu nutzen.

Grüße, JasonDelife.

  • Autor

        private void button1_Click(object sender, EventArgs e)

        {

            backgroundWorker1 = new BackgroundWorker();

            backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);

            backgroundWorker1.RunWorkerAsync();

        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)

        {

            for (int i = 0; i < 100; i++)

            {

                progressBar1.Value = i;

                Thread.Sleep(100);

            }

        }

Also hier passiert leider nichts :(

Der BackgrundWorker befreit nicht von der Pflicht, Control-Zugriffe in den GUI-Thread zu verlagern. Er erleichtert es lediglich. (ReportsProgress + ProgressChanged)

Grüße, JasonDelife.

Wieso ist es ( selbst in .NET ) so kompliziert das zu Verwalten?

Weil Threading nunmal nicht einfach ist. Und in .NET ist es eigentlich recht einfach.

Vllt. hilft dir das:

BackgroundWorker-Klasse (System.ComponentModel)

Gewusst wie: Ausführen eines Vorgangs im Hintergrund

Empfohlene Vorgehensweise für das verwaltete Threading

Wenn nicht, musst du uns genauer beschreiben, was du tun willst.

Grüße, JasonDelife.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.