如何按顺序而非并行等待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
相关产品推荐
相关产品推荐

