Heim >Backend-Entwicklung >C++ >Wie kann die sequentielle Aufgabenausführung und der Wiedereintritt in asynchrone Vorgänge sichergestellt werden?
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
Die geänderte AsyncOp
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!