天天看點

unity + WebClient顯示下載下傳速度,目前下載下傳量,下載下傳總量

在這資源更新的進度條顯示時

using (WebClient client = new WebClient()) {
                sw.Start();
                client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
                client.DownloadFileAsync(new System.Uri(url), currDownFile);
            }      

注冊上進度條下載下傳的委托和下載下傳完成的委托就可以了

在更新進度條的委托中可以得到下載下傳的進度條和下載下傳的總大小以及已經下載下傳的大小。

用e.UserState可以取到傳入的參數,由于是下載下傳檔案有可能下載下傳多個但是更新進度條的方法都走的一個方法是以需要用UserState來取得對應下載下傳任務的進度條。

下面貼一下這兩個委托的實作方法,我将WebClient簡單封裝了一下。

private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e) {
        //下載下傳的總量
        PrecentData preData = new PrecentData();
        preData.total = string.Format("{0} MB / {1} MB", (e.BytesReceived / 1024d / 1024d).ToString("0.00"),  (e.TotalBytesToReceive / 1024d / 1024d).ToString("0.00"));
        preData.precent = (float)e.BytesReceived / (float)e.TotalBytesToReceive;



            string value = string.Format("{0} kb/s", (e.BytesReceived / 1024d / sw.Elapsed.TotalSeconds).ToString("0.00"));

        preData.speed = value;

        Loom.QueueOnMainThread((param) =>
        {
            NotificationCenter.Get().ObjDispatchEvent(KEventKey.m_evDownload, preData);
        }, null);

        
            NotiData data = new NotiData(NotiConst.UPDATE_PROGRESS, value);
            if (m_SyncEvent != null) m_SyncEvent(data);

            if (e.ProgressPercentage == 100 && e.BytesReceived == e.TotalBytesToReceive) {
                sw.Reset();

                data = new NotiData(NotiConst.UPDATE_DOWNLOAD, currDownFile);
                if (m_SyncEvent != null) m_SyncEvent(data);
            }
        }      
string.Format("{0} MB / {1} MB", (e.BytesReceived / 1024d / 1024d).ToString("0.00"),  (e.TotalBytesToReceive / 1024d / 1024d).ToString("0.00"));      
string.Format("{0} kb/s", (e.BytesReceived / 1024d / sw.Elapsed.TotalSeconds).ToString("0.00"));