首页 > 后端开发 > C++ > 如何在 C# 中创建可等待事件处理程序,以便在应用程序关闭之前异步保存数据?

如何在 C# 中创建可等待事件处理程序,以便在应用程序关闭之前异步保存数据?

Barbara Streisand
发布: 2025-01-08 12:46:41
原创
967 人浏览过

How Can I Make Awaitable Event Handlers in C# for Asynchronous Data Saving Before Application Shutdown?

C# 中的异步事件处理程序实现

问题:可等待的事件处理

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板