Page 1 of 1

Warten Sie nie einen Rückruf auf dem UI

Posted: 02 Feb 2025, 18:05
by Anonymous
Ich habe in letzter Zeit nur wenige Bibliotheken entwickelt und bin auf ein Problem gestoßen, das mich stört, da ich den Grund dafür nicht finden kann, warum dies passiert. Beispiel: < /p>

Code: Select all

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

// When we click a button, this happens.
private async void start_Click(object sender, EventArgs e)
{
await Task.Run(() => Work());

// When iterations are set to more than 10,000 in 'Work' method,
// this never runs.
Debug.WriteLine("Successfully Left Await!");
}

private void Work()
{
for (int i = 0; i < 10001; i++)
{
BeginInvoke(() =>
{
label1.Text = i.ToString();
});
}

// This always runs successfully.
Debug.WriteLine("Made Sure the Loop successfully finished!");
}
}
< /code>
Was wir hier haben, ist ein sehr einfacher Code in Windows -Formularen. Wir haben eine Methode, die ausgeführt wird, wenn wir auf eine Schaltfläche klicken. Diese Methode führt die "Arbeit" -Methode in 'Task.run ()' aus und wartet dann auf die Aufgabe. Erfolgreich warten! '. Das faszinierende Ding ist: [b] es wird es niemals erreichen [/b]. Der Ausführungsfluss stoppt für immer an der erwarteten Zeile, auch wenn die Methode schließlich abgeschlossen ist. >, es funktioniert. Zu warten und wir haben es auch in einen Beginninvoke 
am Ende der Schleife eingerichtet. Warten werden auch erfolgreich zurückgegeben. LI> Wenn die Aufgabe wartet, wird mit .ConfigureAwait (false) konfiguriert. Es funktioniert auch. Das beginNvoke Spam macht den UI -Thread zu beschäftigt? Aus der aufgerufenen Methode geschieht?>