如何为仅含Awaiter无Task的Unity WWW类实现异步超时?
Unity中给WWW类的await操作添加超时处理
嘿,你的思路方向是对的!用Task.WhenAny来同时等待WWW请求和超时任务确实是Unity里处理这类场景的常用手段,不过这里有几个细节要注意,能让你的代码更健壮:
- 务必清理超时后的WWW资源:如果请求超时,WWW对象可能还在后台占用网络或内存资源,记得调用
www.Dispose()来释放,避免内存泄漏。 - 更直观的任务判断方式:你可以直接对比
Task.WhenAny返回的完成任务,来判断是否超时,比检查wwwTask.IsCompleted更清晰:var timeoutTask = Task.Delay(20000); var completedTask = await Task.WhenAny(wwwTask, timeoutTask); if (completedTask == timeoutTask) { // 超时分支:清理资源+处理超时逻辑 www.Dispose(); Debug.Log("请求超时,请检查网络或稍后重试"); } else { // 请求成功完成,处理返回结果 var responseText = www.text; // 这里写你的业务逻辑 } - 封装成扩展方法更易用:既然你已经实现了
GetAwaiter()的扩展,不妨把超时逻辑也封装进去,以后复用起来更方便:
使用时只需要用public static async Task<WWW> WithTimeout(this WWW www, int millisecondsTimeout) { var timeoutTask = Task.Delay(millisecondsTimeout); var completedTask = await Task.WhenAny(www.GetAwaiter().GetTask(), timeoutTask); if (completedTask == timeoutTask) { www.Dispose(); throw new TimeoutException("WWW请求超时"); } return www; }try-catch捕获超时异常即可:try { var www = new WWW("你的请求地址"); await www.WithTimeout(20000); // 处理成功结果 } catch (TimeoutException) { // 处理超时逻辑 }
另外提个小建议:Unity的WWW类已经被标记为过时(obsolete)了,官方更推荐使用UnityWebRequest,它原生支持Task和超时配置,API设计也更现代,新项目可以优先考虑切换过去哦。
内容的提问来源于stack exchange,提问作者piojo
相关产品推荐
相关产品推荐

