首頁 > 後端開發 > C++ > 如何在 C# 中建立可等待事件處理程序,以便在應用程式關閉之前非同步保存資料?

如何在 C# 中建立可等待事件處理程序,以便在應用程式關閉之前非同步保存資料?

Barbara Streisand
發布: 2025-01-08 12:46:41
原創
968 人瀏覽過

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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板