none
Aktualisierung UI-Element (Parallel.For) RRS feed

  • Frage

  • Progress-Bar wird nicht aktualisiert (ohne, dass man die parallele Verarbeitung praktisch aufgibt)!

    WPF/NET 6.0

    public delegate void NextPrimeDelegate();
            int counter, elements;
    
            void Button_Click(object sender, RoutedEventArgs e)
            {
                int[] test = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    
                counter = 0;
                elements = test.Length;
    
                Parallel.For(0, test.Length,
                                 async index => {
                                     TestLoop();
                                 });
    
                MessageBox.Show("Ready");            
            }
    
            void TestLoop()
            {
                double j;
                for (int i = 0; i < 1000000000; i++)
                {
                    j = Math.Sqrt(i);
                }
                counter++;
                _progress.Dispatcher.BeginInvoke(DispatcherPriority.Send, new NextPrimeDelegate(_setProgress));
                
            }
    
            void _setProgress()
            {
                _progress.Value = counter * 100 / elements;
            }



    • Bearbeitet hth26 Montag, 16. Mai 2022 20:26
    Montag, 16. Mai 2022 19:40

Antworten

  • Vielen Dank! Hier meine geänderte Variante. (Die Zugriffssperre (lock) scheint so nicht erforderlich zu sein)? Codeblock einfügen funktioniert leider gerade nicht, deshalb Screenshot.

        async void Button_Click(object sender, RoutedEventArgs e)
        {
            int[] test = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            counter = 0;
            elements = test.Length;
            await Task.Run(() => { Parallel.For(0, test.Length, index =>
                {
                TestLoop();
                counter++;
                _progress.Dispatcher.Invoke(DispatcherPriority.Send, new NextPrimeDelegate(_setProgress));
                });
              });
            MessageBox.Show("Ready");
        }
    Mittwoch, 25. Mai 2022 07:59

Alle Antworten

  • Hallo hth26,

    Du hast im Code keine Zugriffssperre angewendet. Würdest Du die parallele Schleife in einer Task.Run-Methode einschließen und eine Zugriffssperre (lock) in der Methode, die den Fortschritt festlegt (_setProgress), implementieren? Ein Beispiel findest Du in diesem Thread:
    Updating progressbar in parallel loop

    Zu diesem Zweck könnte auch die SpinWait-Methode Hilfe leisten, wie im Codebeispiel aus folgendem Thread:
    Updating a progress bar from inside a Parallel.For

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 17. Mai 2022 07:56
    Moderator
  • Vielen Dank! Hier meine geänderte Variante. (Die Zugriffssperre (lock) scheint so nicht erforderlich zu sein)? Codeblock einfügen funktioniert leider gerade nicht, deshalb Screenshot.

        async void Button_Click(object sender, RoutedEventArgs e)
        {
            int[] test = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            counter = 0;
            elements = test.Length;
            await Task.Run(() => { Parallel.For(0, test.Length, index =>
                {
                TestLoop();
                counter++;
                _progress.Dispatcher.Invoke(DispatcherPriority.Send, new NextPrimeDelegate(_setProgress));
                });
              });
            MessageBox.Show("Ready");
        }
    Mittwoch, 25. Mai 2022 07:59
  • Vielen Dank! Ich kann leider nicht richtig antworten (mit der fertigen Lösung), da die Antwort blockiert wird (gelber HTML-Text)!
    Mittwoch, 25. Mai 2022 08:04
  • Hallo hth26,

    Ich habe Deine Antwort vom 25. Mai 2022 7:59 wiederhergestellt und den Code formatiert, damit die Lösung künftigen Lesern dieses Threads nützlich sein kann. Bestätige bitte, dass dieser Codeauszug die von Dir erwähnte fertige Lösung beinhaltet, und markiere diese, falls zutreffend, als Antwort.

    Gruß,
    Dimitar

    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 31. Mai 2022 12:11
    Moderator