问题:可等待的事件处理
在 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中文网其他相关文章!