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ß
s. [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)
PS: Control.Invoke
ist eine andere Methode als event.Invoke
(also nicht verwechseln).
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Guten Morgen,
Danke für den Link und dem Hinweis von Reactive Extensions.
Gruß