UnityWebRequest 异步下载

UnityWebRequest的异步写法

using System;
using System.Threading;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;

public class Example : MonoBehaviour
{
    /// <summary>
    /// 任务取消源
    /// </summary>
    CancellationTokenSource ts = new CancellationTokenSource();
    void Start()
    {
        SynchronizationContext.SetSynchronizationContext(SynchronizationContext.Current);
        Test();
    }

    private void OnDestroy()
    {
        // 取消访问
        ts.Cancel();
    }

    async void Test()
    {
        string url = "http://www.baidu.com";
        try
        {
            // 更新进度
            var progress = new Progress<float>(v =>
            {
                Debug.Log(v);
            });
            // ts.Token 创建取消通知
            // 访问链接
            var www = await RequestHelper.GetAsync(url, null, progress, ts.Token, 5000);
            // 假如取消了访问,因为异步内部抛出了AggregateException异常,下面语句不再执行
            Debug.Log(www.downloadHandler.text.Length);
        }
        catch(Exception ex)
        {
            Debug.LogError(ex);
        }
    }
}
public class RequestHelper
{
    public static async Task<UnityWebRequest> GetAsync(string url, int timeout = 10000)
    {
        var request = UnityGetRequest.Create(url, null, timeout);
        while (!request.isDone)
        {
            await Task.Delay(16);
        }
        return request.unityWebRequest;
    }
    public static async Task<UnityWebRequest> GetAsync(string url, IProgress<float> progress, int timeout = 10000)
    {
        var request = UnityGetRequest.Create(url, null, timeout);

        while (!request.isDone)
        {
            progress.Report(request.Progress);
            await Task.Delay(16);
        }
        return request.unityWebRequest;
    }
    public static async Task<UnityWebRequest> GetAsync(string url, IProgress<float> progress, CancellationToken token, int timeout = 10000)
    {
        var request = UnityGetRequest.Create(url, null, timeout);

        while (!request.isDone)
        {
            if (token.IsCancellationRequested)
            {
                token.ThrowIfCancellationRequested();
            }
            progress.Report(request.Progress);
            await Task.Delay(16);
        }
        return request.unityWebRequest;
    }
    public static async Task<UnityWebRequest> GetAsync(string url, WWWForm formData,  IProgress<float> progress, CancellationToken token, int timeout=10000)
    {
        var request = UnityGetRequest.Create(url, formData, timeout);

        while (!request.isDone)
        {
            if (token.IsCancellationRequested)
            {
                token.ThrowIfCancellationRequested();
            }
            progress.Report(request.Progress);
            await Task.Delay(16);
        }
        return request.unityWebRequest;
    }

    public static async Task<UnityWebRequest> PostAsync(string url, WWWForm formData, IProgress<float> progress, CancellationToken token, int timeout = 10000)
    {
        var request = UnityPostRequest.Create(url, formData, timeout);

        while (!request.isDone)
        {
            if (token.IsCancellationRequested)
            {
                token.ThrowIfCancellationRequested();
            }
            progress.Report(request.Progress);
            await Task.Delay(16);
        }
        return request.unityWebRequest;
    }

    interface IUnityWebRequest
    {
        bool isDone { get; }
        float Progress { get; }
        UnityWebRequest unityWebRequest { get; }
    }
    class UnityGetRequest : IUnityWebRequest
    {
        UnityWebRequest request;
        bool IUnityWebRequest.isDone => request.isDone;

        float IUnityWebRequest.Progress => request.downloadProgress;

        UnityWebRequest IUnityWebRequest.unityWebRequest => request;

        public static IUnityWebRequest Create(string url, WWWForm formData, int timeout)
        {
            UnityGetRequest unityGetRequest = new UnityGetRequest();
            unityGetRequest.request = UnityWebRequest.Get(url);
            unityGetRequest.request.timeout = timeout;
            if (formData != null)
            {
                foreach (var header in formData.headers)
                {
                    unityGetRequest.request.SetRequestHeader(header.Key, header.Value);
                }
            }
            unityGetRequest.request.SendWebRequest();
            return unityGetRequest;
        }
    }
    class UnityPostRequest : IUnityWebRequest
    {
        UnityWebRequest request;

        bool IUnityWebRequest.isDone => request.isDone;

        float IUnityWebRequest.Progress => request.uploadProgress;

        UnityWebRequest IUnityWebRequest.unityWebRequest => request;

        public static IUnityWebRequest Create(string url, WWWForm formData, int timeout)
        {
            UnityPostRequest unityPostRequest = new UnityPostRequest();
            unityPostRequest.request = UnityWebRequest.Post(url, formData);
            unityPostRequest.request.timeout = timeout;
            unityPostRequest.request.SendWebRequest();
            return unityPostRequest;
        }
    }
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼游戏开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值