OK, also habe ich eine statische asynchrone Methode erstellt. Dadurch wurde das Steuerelement deaktiviert, das die Aktion startet und den Anwendungscursor ändert. Es führt die Aktion als Aufgabe aus und wartet auf den Abschluss. Die Steuerung kehrt zum Anrufer zurück, während dieser wartet. Die Anwendung reagiert also auch dann, wenn sich das Besetztzeichen dreht.
async public static void LengthyOperation(Control control, Action action)
{
try
{
control.Enabled = false;
Application.UseWaitCursor = true;
Task doWork = new Task(() => action(), TaskCreationOptions.LongRunning);
Log.Info("Task Start");
doWork.Start();
Log.Info("Before Await");
await doWork;
Log.Info("After await");
}
finally
{
Log.Info("Finally");
Application.UseWaitCursor = false;
control.Enabled = true;
}
Hier ist der Code aus dem Hauptformular
private void btnSleep_Click(object sender, EventArgs e)
{
var control = sender as Control;
if (control != null)
{
Log.Info("Launching lengthy operation...");
CursorWait.LengthyOperation(control, () => DummyAction());
Log.Info("...Lengthy operation launched.");
}
}
private void DummyAction()
{
try
{
var _log = NLog.LogManager.GetLogger("TmpLogger");
_log.Info("Action - Sleep");
TimeSpan sleep = new TimeSpan(0, 0, 16);
Thread.Sleep(sleep);
_log.Info("Action - Wakeup");
}
finally
{
}
}
Ich musste einen separaten Logger für die Dummy-Aktion verwenden (ich verwende Nlog) und mein Hauptlogger schreibt in die Benutzeroberfläche (ein Rich-Text-Feld). Ich konnte die Besetzt-Cursor-Show nur dann nicht abrufen, wenn sie sich über einem bestimmten Container im Formular befand (aber ich habe mich nicht sehr bemüht). Alle Steuerelemente haben eine UseWaitCursor-Eigenschaft, aber sie scheinen keine Auswirkungen auf die Steuerelemente zu haben Ich habe es versucht (vielleicht weil sie nicht oben waren?)
Hier ist das Hauptprotokoll, das die Ereignisse in der von uns erwarteten Reihenfolge zeigt:
16:51:33.1064 Launching lengthy operation...
16:51:33.1215 Task Start
16:51:33.1215 Before Await
16:51:33.1215 ...Lengthy operation launched.
16:51:49.1276 After await
16:51:49.1537 Finally