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

如何按顺序而非并行等待C# Task,实现测试用例乱序后串行执行?

问题原因

方法2并行执行的核心原因是:异步方法在被调用的瞬间就已经启动执行,不是等到await的时候才启动。
你将VTestDriveClosedLoop、VTestLimitsCl这类方法直接调用后存入List<Task<bool>>的那一刻,4个测试任务就已经全部启动并行运行了,后续遍历列表await只是逐个等待任务完成,自然不会串行执行。

解决方案

把列表存储的内容从「已经启动的Task对象」换成「可以生成Task的委托Func<Task<bool>>」,只有在你主动调用委托的时候才会启动对应测试任务,就能完全控制执行顺序。

修改后代码示例

private async void RunVisca()
{
    Ptz ptz = new Ptz(SelectedComPort, (byte)(1), SelectedBaudRate, Node.DeviceType.PTZ);

    UpdateResults("VISCA TEST START\n\n");

    // 存储委托,不会立刻启动测试
    List<Func<Task<bool>>> tests = new List<Func<Task<bool>>>();
    tests.Add(() => VTestDriveClosedLoop(ptz, true));
    tests.Add(() => VTestDriveClosedLoop(ptz, false));
    tests.Add(() => VTestLimitsCl(ptz, 125, 20));
    tests.Add(() => VTestLimitsOl(ptz, 125, 20));

    // 可在此处对tests列表做打乱顺序操作,比如Fisher-Yates洗牌
    Shuffle(tests);

    // 按顺序逐个启动并等待测试完成,串行执行
    foreach (var testFactory in tests)
    {
        _ = await testFactory().ConfigureAwait(true);
    }

    UpdateResults("\nTEST COMPLETE\n\n");
}

// 列表洗牌方法示例
private void Shuffle<T>(IList<T> list)
{
    Random rng = new Random();
    int n = list.Count;
    while (n > 1)
    {
        n--;
        int k = rng.Next(n + 1);
        T value = list[k];
        list[k] = list[n];
        list[n] = value;
    }
}

额外优化建议

如果RunVisca不是事件处理方法,建议把返回值从async void改成async Task,方便上层调用者捕获处理异步异常。

内容的提问来源于stack exchange,提问作者Major Major

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:54:04