C#按预设调度规则执行四个异步任务的实现求助
异步任务调度实现调整方案
需求规则
需要调度4个任务执行,规则如下:
Task1与Task2并行启动执行Task3仅在Task1或Task2任意一个完成时启动Task4必须在前三个任务全部完成后才可启动执行
原有代码问题
原有实现不符合编码要求,同时存在逻辑bug:
- 单独封装了
waitAny()函数处理任务等待逻辑,要求移除该独立封装 ContinueWith回调中使用了async关键字,要求移除该用法- 重复调用
runTask1()/runTask2()/runTask3()会生成全新的任务实例,等待逻辑没有关联到最初启动的并行任务,会导致任务重复执行、调度时序错误
调整后可运行代码
static void Main(string[] args) { // 第一步:并行启动Task1、Task2,持有任务引用避免重复启动 Task task1 = runTask1(); Task task2 = runTask2(); // 直接在主流程处理任意任务完成的等待逻辑,不做独立函数封装 Task.WhenAny(task1, task2).ContinueWith(antecedent => { // 任意前置任务完成,启动Task3 Task task3 = runTask3(); // 等待三个前置任务全部完成后启动Task4,不使用async关键字,通过ContinueWith接续 Task.WhenAll(task1, task2, task3).ContinueWith(_ => { // 等待Task4执行完成,不需要async/await语法 runTask4().Wait(); }); }); Console.ReadKey(); }
实现说明
- 移除了独立的
waitAny()封装函数,任务等待逻辑直接写入主流程 - 所有
ContinueWith委托均未使用async关键字,通过任务接续嵌套实现依赖调度,避免了async void回调的异常丢失、状态不可追踪问题 - 提前持有首次启动的任务实例,修正了原代码重复启动任务的逻辑bug,保证调度时序符合要求
提示:如果使用支持异步Main的.NET版本(C# 7.1+),也可以用async/await写出更简洁的版本,上述代码是严格贴合两个编码限制要求的实现。
内容的提问来源于stack exchange,提问作者QuangGiap
相关产品推荐
相关产品推荐

