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.
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)
{
}
}
No Comments