Skip to main content

Asynchrone Funktion - GUI wird nicht gesperrt

Beschreibung

Die Schleife zählt bis 299 hoch und gibt anschließend ein true zurück.
Dann gibt die Messagebox den boolean Wert aus, jedoch erst, wenn die Methode Test abgeschlossen wurde.

grafik.png

Code

public MainWindow()
{
    InitializeComponent();
 
    // Beginnen der Operation
    RunCount();
}
 
private async void RunCount()
{
    DateTime start = DateTime.Now;
 
    // Ausführen der asynchronen Methode
    bool done = await Count(300);
 
    // Message wird ausgegeben, sobald vorheriger Task abgeschlossen wurde
    MessageBox.Show(string.Format("Zeit vergangen: {0} sec; Ergebnis: {1}",
        (DateTime.Now - start).TotalSeconds, done.ToString()));
}
 
private async Task<bool> Count(int max)
{
    // Einfache Schleife
    for (int pos = 0; pos < max; pos++)
    {
        // Um das Hochzählen sichtbar zu machen
        await Task.Delay(1);
 
        // In einer asynchronen Methode kann nicht direkt auf die GUI zugegriffen werden.
        // Deshalb muss ein Dispatcher her
        ExecuteJobDispatched(() =>
        {
            listBox.Items.Add(pos);
        });
    }
 
    return true;
}
 
private void ExecuteJobDispatched(Action callback)
{
    try
    {
        // Zugriff auf ListView über invoke
        Dispatcher.Invoke(callback);
    }
    catch (Exception e)
    {
    }
}