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
Freigeben: 2025-01-08 12:46:41
Original
968 Leute haben es durchsucht

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>
Nach dem Login kopieren

Nutzungsbeispiele

<code class="language-csharp">Game game = new Game();

game.GameShuttingDown += async (sender, args) => await SaveUserData();

await game.Shutdown();</code>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage