Séquencement des tâches et réentrée : une solution détaillée
Considérez le scénario suivant :
Pour résoudre ce problème, nous introduisons le concept de réentrée, garantissant que l'ordre de les tâches sont conservées même lorsque des tâches imbriquées sont exécutées.
Exemple Code
// 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; } }
Sortie
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
Avec cette solution, la sortie souhaitée est obtenue, même lorsque la réentrée est introduite.
Synchronisation et annulation
La classe AsyncOp peut être étendue à prendre en charge la synchronisation et l'annulation en ajoutant des mécanismes appropriés.
Conclusion
En comprenant les concepts de séquençage des tâches et de réentrée, nous avons développé une solution robuste qui maintient l'ordre de tâches et prend en charge les tâches imbriquées. Ce modèle est particulièrement utile dans les scénarios où les commandes arrivent de manière asynchrone et dépendent des résultats des commandes précédentes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!