Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Event-Daten aus await Task.Run(() => im UI anzeigen.
Quia_Respexit
myCSharp.de - Member



Dabei seit:
Beiträge: 9

Themenstarter:

Event-Daten aus await Task.Run(() => im UI anzeigen.

beantworten | zitieren | melden

Hallo zusammen,

ich habe in der Vergangenheit bis jetzt über IProgress den Aufrufer informiert. Jetzt soll das Ganze auch über Events geschehen. Hier gesellt sich entsprechend das Problem mit dem Zugriff auf das UI, welches mir z.Z. Probleme bereitet. Ich bekomme es nicht hin, dass der Aufrufer die durch das Event überbrachten Daten anzeigen kann, da es sich halt um einen anderen Thread handelt und somit eine Exception geworfen wird. Unten findet sich ein 0815 Beispiel dazu. Wie könnte ich die Daten aus dem Event im Formular anzeigen, ohne die Exception zu werfen?


namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private Test _Test;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            _Test = new Test();
            _Test.Progress += (o, i) => { label1.Text = i.ToString(); };
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            await _Test.MyCalculation();
        }
    }

    public class Test
    {
        public event EventHandler<int> Progress;

        public async Task MyCalculation()
        {
            int c = 1000000;

            await Task.Run(() =>
            {
                for (int i = 0; i < c; i++)
                {
                    if (i % 7 == 0)
                    {
                        this.Progress?.Invoke(this, i);
                    }
                }
            });
        }
    }
}

Gruß
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3950

beantworten | zitieren | melden

s. [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)

PS: Control.Invoke ist eine andere Methode als event.Invoke (also nicht verwechseln).
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15526
Herkunft: BW

beantworten | zitieren | melden

Schau Dir Reactive Extensions an, das ist für solche Zwecke gemacht.
In wenigen Zeilen umsetzbar.

PS: die Logik stellt eine asynchrone Methode zur Verfügung, der dann via await aufgerufen werden kann.
Task.Run() als Aufruf ist in 99% der Fällen aus der UI nicht korrekt.

Aber das alles nimmt Dir ohnehin RX ab.
private Nachricht | Beiträge des Benutzers
Quia_Respexit
myCSharp.de - Member



Dabei seit:
Beiträge: 9

Themenstarter:

beantworten | zitieren | melden

Guten Morgen,


Danke für den Link und dem Hinweis von Reactive Extensions.

Gruß
private Nachricht | Beiträge des Benutzers