Laden...

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

Erstellt von Quia_Respexit vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.132 Views
Q
Quia_Respexit Themenstarter:in
9 Beiträge seit 2018
vor 4 Jahren
Event-Daten aus await Task.Run(() => im UI anzeigen.

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ß

16.807 Beiträge seit 2008
vor 4 Jahren

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.

Q
Quia_Respexit Themenstarter:in
9 Beiträge seit 2018
vor 4 Jahren

Guten Morgen,

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

Gruß