Benutzer mit den meisten Antworten
Aktualisierung UI-Element (Parallel.For)

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
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"); }
- Bearbeitet Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 31. Mai 2022 12:11 im Codeblock formatiert
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 3. Juni 2022 10:53
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 15. Juni 2022 11:30
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.
- Bearbeitet Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 17. Mai 2022 07:57
-
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"); }
- Bearbeitet Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 31. Mai 2022 12:11 im Codeblock formatiert
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 3. Juni 2022 10:53
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 15. Juni 2022 11:30
-
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ß,
DimitarBitte 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.