myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Entwicklung (https://www.mycsharp.de/wbb2/board.php?boardid=3)
-- Basistechnologien und allgemeine .NET-Klassen (https://www.mycsharp.de/wbb2/board.php?boardid=23)
--- Event-Daten aus await Task.Run(() => im UI anzeigen. (https://www.mycsharp.de/wbb2/thread.php?threadid=121936)


Geschrieben von Quia_Respexit am 11.06.2019 um 11:16:
  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?

C#-Code:
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ß


Geschrieben von Th69 am 11.06.2019 um 11:18:
 
s.  [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)

PS: Control.Invoke ist eine andere Methode als event.Invoke (also nicht verwechseln).


Geschrieben von Abt am 11.06.2019 um 11:39:
 
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.


Geschrieben von Quia_Respexit am 13.06.2019 um 07:32:
 
Guten Morgen,


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

Gruß


© Copyright 2003-2019 myCSharp.de-Team | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 24.06.2019 23:21