Heim >Backend-Entwicklung >C++ >Wie kann ich in C# erwartbare Ereignishandler für die asynchrone Datenspeicherung vor dem Herunterfahren der Anwendung erstellen?

Wie kann ich in C# erwartbare Ereignishandler für die asynchrone Datenspeicherung vor dem Herunterfahren der Anwendung erstellen?

Barbara Streisand
Barbara StreisandOriginal
2025-01-08 12:46:411054Durchsuche

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

Asynchrone Event-Handler-Implementierung in C#

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn