You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:06:22