問題:可等待的事件處理
在 C# 應用程式中,您可能面臨一個挑戰:需要可等待的事件處理程序來確保在應用程式關閉之前完成非同步資料保存任務。目前,事件的同步特性會導致遊戲在非同步保存完成之前關閉。
解決方案:自訂事件委託
推薦的方法是建立一個自訂事件委託,該委託返回 Task 而不是 void。這樣就可以等待處理程序,並確保它們在繼續執行之前完成。
實作
<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>
使用方法範例
<code class="language-csharp">Game game = new Game(); game.GameShuttingDown += async (sender, args) => await SaveUserData(); await game.Shutdown();</code>
替代方案:註冊與明確呼叫
另一種選擇是註冊回調並在需要時明確呼叫它們。
<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>
結論
雖然非同步事件處理程序可能並非最佳設計選擇,但可以使用自訂事件委託或透過註冊和明確呼叫回調來以可等待的方式實現它們。
以上是如何在 C# 中建立可等待事件處理程序,以便在應用程式關閉之前非同步保存資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!