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

如何为仅含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:23:06