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

Unity中使用UniRx实现WhenAll模式:并行执行异步任务的正确方式

Unity中UniRx结合async-await实现并行异步请求

要将原本串行执行的异步请求改成并行执行,核心是先同时启动所有异步任务,再等待全部任务完成后统一获取结果,而不是逐个等待。以下是两种场景下的正确实现:

场景1:GetCompletion返回Task<string>

如果textAI.GetCompletion直接返回标准.NET Task类型,写法如下:

// 同时启动两个异步任务,此时两个请求已经并行执行
Task<string> task1 = textAI.GetCompletion("Albeit Einstein was");
Task<string> task2 = textAI.GetCompletion("Susan Sarandon is");

// 等待所有任务完成,这一步会阻塞直到两个请求都返回结果
await Task.WhenAll(task1, task2);

// 任务完成后安全获取结果
string result1 = task1.Result;
string result2 = task2.Result;

Debug.Log("Results: " + result1 + ", " + result2);

场景2:GetCompletion返回UniRx的IObservable<string>

如果textAI.GetCompletion返回的是UniRx的Observable类型,需要先将其转换为Task,再执行并行逻辑:

// 把Observable转换为Task,同时启动任务
Task<string> task1 = textAI.GetCompletion("Albeit Einstein was").ToTask();
Task<string> task2 = textAI.GetCompletion("Susan Sarandon is").ToTask();

// 等待所有任务完成
await Task.WhenAll(task1, task2);

// 获取结果
string result1 = task1.Result;
string result2 = task2.Result;

Debug.Log("Results: " + result1 + ", " + result2);

关键注意事项

  • 不能在Task.WhenAll的参数中直接使用await,否则会退化为串行执行(第一个任务完成后才会启动第二个)。
  • 若需要处理异常,需用try-catch包裹await Task.WhenAll代码块,捕获AggregateException来处理单个任务的异常。
  • 确保textAI.GetCompletion方法本身支持并行调用(比如内部没有独占资源的限制),否则并行执行可能达不到预期效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 09:10:28