任务排序和重入
问题:
考虑一个场景,其中任务可以可以同步或异步执行。如果在前一个任务仍处于待处理状态时接收到新任务,则新任务应排队并按顺序执行。此外,每个任务的结果可能取决于前一个任务的结果。挑战在于实现此逻辑的同时还支持可重入,其中任务可能会连续执行多次。
解决方案:
强制顺序执行任务并为了防止由于重入而破坏逻辑,需要使用Task
修改后的 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; } }
通过使用这个修改后的 AsyncOp 类,可以确保任务的顺序执行和重入。修改后的代码会产生所需的输出:
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
以上是异步操作中如何保证任务的顺序执行和重入?的详细内容。更多信息请关注PHP中文网其他相关文章!