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
相关产品推荐
相关产品推荐

