Problem: Behandlung erwarteter Ereignisse
In einer C#-Anwendung stehen Sie möglicherweise vor einer Herausforderung: Sie benötigen wartebare Ereignishandler, um sicherzustellen, dass asynchrone Datenspeicheraufgaben abgeschlossen werden, bevor die Anwendung geschlossen wird. Derzeit führt die synchrone Natur des Ereignisses dazu, dass das Spiel geschlossen wird, bevor der asynchrone Speichervorgang abgeschlossen ist.
Lösung: Benutzerdefinierte Ereignisdelegation
Der empfohlene Ansatz besteht darin, einen benutzerdefinierten Ereignisdelegaten zu erstellen, der eine Aufgabe anstelle von „void“ zurückgibt. Auf diese Weise können Sie auf Handler warten und sicherstellen, dass diese abgeschlossen sind, bevor Sie fortfahren.
Leistung
<code class="language-csharp">class Game { public event Func<object, EventArgs, Task> GameShuttingDown; public async Task Shutdown() { Func<object, EventArgs, Task> handler = GameShuttingDown; if (handler == null) return; Delegate[] invocationList = handler.GetInvocationList(); Task[] handlerTasks = new Task[invocationList.Length]; for (int i = 0; i < invocationList.Length; i++) { handlerTasks[i] = ((Func<object, EventArgs, Task>)invocationList[i])(this, EventArgs.Empty); } await Task.WhenAll(handlerTasks); } }</code>
Nutzungsbeispiele
<code class="language-csharp">Game game = new Game(); game.GameShuttingDown += async (sender, args) => await SaveUserData(); await game.Shutdown();</code>
Alternative: anmelden und explizit anrufen
Eine weitere Möglichkeit besteht darin, Rückrufe zu registrieren und sie bei Bedarf explizit aufzurufen.
<code class="language-csharp">class Game { private List<Func<Task>> _shutdownCallbacks = new List<Func<Task>>(); public void RegisterShutdownCallback(Func<Task> callback) { _shutdownCallbacks.Add(callback); } public async Task Shutdown() { var callbackTasks = new List<Task>(); foreach (var callback in _shutdownCallbacks) { callbackTasks.Add(callback()); } await Task.WhenAll(callbackTasks); } }</code>
Fazit
Auch wenn asynchrone Ereignishandler möglicherweise nicht die beste Wahl für das Design sind, können sie mithilfe eines benutzerdefinierten Ereignisdelegierten oder durch Registrierung und expliziten Aufruf eines Rückrufs auf erwartbare Weise implementiert werden.
Das obige ist der detaillierte Inhalt vonWie kann ich in C# erwartbare Ereignishandler für die asynchrone Datenspeicherung vor dem Herunterfahren der Anwendung erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!