Heim >Backend-Entwicklung >C++ >Wie kann die sequentielle Aufgabenausführung und der Wiedereintritt in asynchrone Vorgänge sichergestellt werden?

Wie kann die sequentielle Aufgabenausführung und der Wiedereintritt in asynchrone Vorgänge sichergestellt werden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-30 12:17:10896Durchsuche

How to Ensure Sequential Task Execution and Re-entrancy in Asynchronous Operations?

Aufgabensequenzierung und Wiedereintritt

Problem:

Stellen Sie sich ein Szenario vor, in dem Aufgaben möglich sind entweder synchron oder asynchron ausgeführt werden. Wenn eine neue Aufgabe empfangen wird, während eine vorherige Aufgabe noch aussteht, sollte die neue Aufgabe in die Warteschlange gestellt und nacheinander ausgeführt werden. Darüber hinaus kann das Ergebnis jeder Aufgabe vom Ergebnis der vorherigen Aufgabe abhängen. Die Herausforderung besteht darin, diese Logik zu implementieren und gleichzeitig den Wiedereintritt zu unterstützen, bei dem eine Aufgabe mehrmals hintereinander ausgeführt werden kann.

Lösung:

Um die sequentielle Aufgabenausführung zu erzwingen und Um eine Unterbrechung der Logik aufgrund von Wiedereintritt zu verhindern, ist es erforderlich, Aufgaben mithilfe der Task-Funktion manuell zu erstellen. Konstruktor und starten Sie sie später. Die Task.Unwrap()-Methode kann verwendet werden, um die eigentliche Aufgabe abzurufen, die ausgeführt wird.

Die geänderte AsyncOp Die folgende Klasse implementiert diesen Ansatz:

class AsyncOp<T>
{
    Task<T> _pending = Task.FromResult(default(T));

    public Task<T> CurrentTask { get { return _pending; } }

    public Task<T> RunAsync(Func<Task<T>> handler, bool useSynchronizationContext = false)
    {
        var pending = _pending;
        Func<Task<T>> wrapper = async () =>
        {
            // await the prev task
            var prevResult = await pending;
            Console.WriteLine("\nprev task result:  " + prevResult);
            // start and await the handler
            return await handler();
        };

        var task = new Task<Task<T>>(wrapper);
        var inner = task.Unwrap();
        _pending = inner;

        task.RunSynchronously(useSynchronizationContext ?
            TaskScheduler.FromCurrentSynchronizationContext() :
            TaskScheduler.Current);

        return inner;
    }
}

Durch die Verwendung dieser modifizierten AsyncOp-Klasse werden die sequentielle Aufgabenausführung und der Wiedereintritt sichergestellt. Der geänderte Code erzeugt die gewünschte Ausgabe:

Test #1...

prev task result:  0
this task arg: 1000

prev task result:  1000
this task arg: 900

prev task result:  900
this task arg: 800

Press any key to continue to test #2...


prev task result:  800
this task arg: 100

prev task result:  100
this task arg: 200

Das obige ist der detaillierte Inhalt vonWie kann die sequentielle Aufgabenausführung und der Wiedereintritt in asynchrone Vorgänge sichergestellt werden?. 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