19.Web请求-WebRequest

本文详细探讨了在GameFramework框架下如何利用C#的WebRequest组件进行网络请求。通过类图展示了WebRequestComponent的结构,并介绍了配置下载器数量的方法,同时提供了代码分析以深入理解其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GameFramework中的WebRequest

类图

WebRequestComponent
入口
WebRequestManager
下载管理器
TaskPool<WebRequestTask>
下载任务池,对任务进行调度
一开始会初始化固定数量的任务执行器
WebRequestTask
下载任务,封装任务数据
ITaskAgent<WebRequestTask>
下载任务执行器接口
用来执行 WebRequestTask
WebRequestAgent
下载任务执行器
用来执行 WebRequestTask
把执行功能委托给 WebRequestAgentHelperBase
WebRequestAgentHelperBase
下载器基类
UnityWebRequestAgentHelper
UnityWebRequest实现的下载器
具体功能委托给 UnityWebRequest
YourWebRequestAgentHelper
有需要可以实现你自己的下载器

使用

先在 WebRequestComponent 中配置:

  • WebRequest Agent Helper Count 下载器数量
    public class TestWebRequest
    {
        static int s_WebRequestId;
        public static void Test()
        {
            GameEntry.Event.Subscribe(WebRequestSuccessEventArgs.EventId, OnWebRequestSuccess);
            GameEntry.Event.Subscribe(WebRequestFailureEventArgs.EventId, OnWebRequestFailure);

            // 向服务器请求版本信息
            s_WebRequestId = GameEntry.WebRequest.AddWebRequest(Utility.Text.Format(GameEntry.BuiltinData.BuildInfo.CheckVersionUrl, GetPlatformPath()), this);
        }

        private static void OnWebRequestSuccess(object sender, GameEventArgs e)
        {
            //  下载成功
            WebRequestSuccessEventArgs args = (WebRequestSuccessEventArgs)e;

            //  有2种方式判断这个下载是不是你要的下载
            //  1. GameFramework内置方式,通过 SerialId 判断
            if ( args.SerialId != s_WebRequestId )
                return ;

            //  2. 你在用户数据中传递一个唯一的索引进行判断
            if ( !(args.UserData == this) )
                return ;
        }

        private static void OnWebRequestFailure(object sender, GameEventArgs e)
        {
            WebRequestFailureEventArgs args = (WebRequestFailureEventArgs)e;
            //  判断是否你的下载,同 OnWebRequestSuccess
            Debug.Log(args.ErrorMessage);
        }
    }

代码分析

    WebRequestComponent.Start()
    {
        //  添加下载器
        for (int i = 0; i < m_WebRequestAgentHelperCount; i++)
        {
            AddWebRequestAgentHelper(i)
            {
                m_WebRequestManager.AddWebRequestAgentHelper(webRequestAgentHelper) //  WebRequestManager.AddWebRequestAgentHelper(IWebRequestAgentHelper webRequestAgentHelper)
                {
                    WebRequestAgent agent = new WebRequestAgent(webRequestAgentHelper);
                    m_TaskPool.AddAgent(agent)
                    {
                        agent.Initialize();
                        m_FreeAgents.Push(agent);   //  加入空闲队列中
                    }
                }
            }
        }
    }

    WebRequestManager.AddWebRequest(string webRequestUri, byte[] postData, string tag, int priority, object userData)
    {
        //  创建下载任务并加入任务池中
        WebRequestTask webRequestTask = WebRequestTask.Create(webRequestUri, postData, tag, priority, m_Timeout, userData);
        m_TaskPool.AddTask(webRequestTask)
        {
            m_WaitingTasks.AddAfter(current, task);     //  任务加入等待队列
        }
        return webRequestTask.SerialId;
    }
    
    //  执行下载任务
    WebRequestManager.Update(float elapseSeconds, float realElapseSeconds)
    {
        m_TaskPool.Update(elapseSeconds, realElapseSeconds)     //  TaskPool<WebRequestTask>.Update
        {
            ProcessRunningTasks(elapseSeconds, realElapseSeconds)
            {
                WebRequestAgent taskAgent = m_WorkingAgents.First;
                taskAgent.Update(elapseSeconds, realElapseSeconds)
                {
                   //   判断正在下载的任务是否超时
                }
            }

            ProcessWaitingTasks(elapseSeconds, realElapseSeconds)   //  TaskPool<WebRequestTask>.ProcessWaitingTasks
            {
                LinkedListNode<WebRequestTask> current = m_WaitingTasks.First;    //  从等待列表中取出第1个任务
                WebRequestTask task = current.Value; 

                ITaskAgent<WebRequestTask> agent = m_FreeAgents.Pop();            //  获得空闲下载任务执行器
                LinkedListNode<ITaskAgent<WebRequestTask>> agentNode = m_WorkingAgents.AddLast(agent);    //  加入执行器列表中

                StartTaskStatus status = agent.Start(task); //  用执行器下载任务
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值