亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#異步下載文件

2020-01-24 01:19:48
字體:
來源:轉載
供稿:網友

在C#當中,利用WebClient這個核心類,可以輕易的打造一個下載器。但是這里想要強調的是,我們用的是異步操作。所謂異步,是相對于同步的概念而言的。比如Web中的Ajax就是基于異步的。它能夠提供良好的用戶體驗,讓用戶在進行操作時,不感覺到“卡”(不阻塞UI線程),能夠同時進行其它的操作并能夠隨意的切換到任務界面。在下載文件時,如果文件過大,我們用同步的下載方式進行下載會感覺程序“假死”,其實程序在后臺不斷的運行,但我們看不到下載的過程。所以這時候使用異步方法能夠有效的解決這個問題。
先看一下程序的界面:

實現上面的操作很簡單,只需要幾行代碼就可以搞定。

private void button1_Click(object sender, EventArgs e) {   using (WebClient client = new WebClient())   {     client.DownloadFileAsync(new Uri(this.textBox1.Text.Trim()),Path.GetFileName(this.textBox1.Text.Trim()));     client.DownloadProgressChanged += client_DownloadProgressChanged;     client.DownloadFileCompleted += client_DownloadFileCompleted;   } }  void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) {   this.label1.Text = string.Format("當前接收到{0}字節,文件大小總共{1}字節", e.BytesReceived, e.TotalBytesToReceive);   this.progressBar1.Value = e.ProgressPercentage; }  void client_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) {   if (e.Cancelled)   {     MessageBox.Show("文件下載被取消", "提示", MessageBoxButtons.OKCancel);   }   this.progressBar1.Value = 0;   MessageBox.Show("文件下載成功", "提示"); } 

我們只需要在textbox中填入文件的地址,比如迅雷的下載地址,就可以用上面的代碼進行下載了。
在C#當中,還可以利用HttpWebRequest進行文件的異步下載。下面的代碼可能稍微有點復雜,但是可以幫助我們深入理解“異步“操作的過程。
我們先定義一個類,用于保存操作的狀態:

/// <summary> /// 請求狀態 /// </summary> public class RequestState {   /// <summary>   /// 緩沖區大小   /// </summary>   public int BUFFER_SIZE { get; set; }    /// <summary>   /// 緩沖區   /// </summary>   public byte[] BufferRead { get; set; }    /// <summary>   /// 保存路徑   /// </summary>   public string SavePath { get; set; }    /// <summary>   /// 請求流   /// </summary>   public HttpWebRequest Request { get; set; }    /// <summary>   /// 響應流   /// </summary>   public HttpWebResponse Response { get; set; }    /// <summary>   /// 流對象   /// </summary>   public Stream ResponseStream { get; set; }    /// <summary>   /// 文件流   /// </summary>   public FileStream FileStream { get; set; } } 

在一個Button的Click事件下,鍵入如下代碼:

//下載文件的url string url = this.textBox1.Text.Trim();  //創建一個初始化請求對象 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url));  //設置下載相關參數 RequestState requestState = new RequestState(); requestState.BUFFER_SIZE = 1024; requestState.BufferRead = new byte[requestState.BUFFER_SIZE]; requestState.Request = request; requestState.SavePath = Path.Combine("D://", Path.GetFileName(url)); requestState.FileStream = new FileStream(requestState.SavePath, FileMode.OpenOrCreate);  //開始異步請求資源 request.BeginGetResponse(new AsyncCallback(ResponseCallback), requestState); 

我們可以看到,異步的操作方法一般都是以Begin開頭的BeginGetResponse,我們平時用的比較多的同步方法直接使用GetResponse。另外AsyncCallback是一個委托,前面講過,它里面的參數是一個方法,我們起名為ResponseCallback,并且把requestState作為參數傳遞過去。
接下來就可以看一下ResponseCallback方法:

/// <summary> /// 請求資源方法的回調函數 /// </summary> /// <param name="asyncResult">用于在回調函數當中傳遞操作狀態</param> private void ResponseCallback(IAsyncResult asyncResult) {   RequestState requestState = (RequestState)asyncResult.AsyncState;   requestState.Response = (HttpWebResponse)requestState.Request.EndGetResponse(asyncResult);    Stream responseStream = requestState.Response.GetResponseStream();   requestState.ResponseStream = responseStream;    //開始異步讀取流   responseStream.BeginRead(requestState.BufferRead, 0, requestState.BufferRead.Length, ReadCallback, requestState); } 

我們可以看到,回調函數里面又有一個異步操作。它的任務是對響應流異步的讀取到緩沖區當中。
再進一步,看一下ReadCallback回調函數。

/// <summary> /// 異步讀取流的回調函數 /// </summary> /// <param name="asyncResult">用于在回調函數當中傳遞操作狀態</param> private void ReadCallback(IAsyncResult asyncResult) {   RequestState requestState = (RequestState)asyncResult.AsyncState;   int read = requestState.ResponseStream.EndRead(asyncResult);   if (read > 0)   {     //將緩沖區的數據寫入該文件流     requestState.FileStream.Write(requestState.BufferRead, 0, read);      //開始異步讀取流     requestState.ResponseStream.BeginRead(requestState.BufferRead, 0, requestState.BufferRead.Length, ReadCallback, requestState);   }   else   {     requestState.Response.Close();     requestState.FileStream.Close();   } } 

這里面是真正的將流寫入文件的過程,并且用BeginRead方法遞歸的寫入文件流直到文件完全寫好為止。

以上就是本文的全部內容,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品91久久久| 国产免费一区二区三区在线能观看| 高清欧美电影在线| 欧美丰满老妇厨房牲生活| 亚洲男人天堂2019| 国产精品第二页| 国产精品黄色影片导航在线观看| 亚洲bt天天射| 成人免费在线视频网站| 欧美性理论片在线观看片免费| 亚洲国产婷婷香蕉久久久久久| 国产精品欧美一区二区三区奶水| 欧美在线免费视频| 91九色国产社区在线观看| 91免费精品视频| 欧洲精品久久久| 国产亚洲精品综合一区91| 91精品国产成人| 青草热久免费精品视频| 九九热精品视频在线播放| 亚洲人成网站色ww在线| 欧美国产亚洲视频| 成人激情视频网| 欧美视频二区36p| 久久精品国产v日韩v亚洲| 欧美成人精品不卡视频在线观看| 国产精品高潮呻吟久久av野狼| 91在线网站视频| 亚洲精品中文字| 亚洲精品国产精品久久清纯直播| 亚洲乱码国产乱码精品精天堂| 性色av香蕉一区二区| 免费99精品国产自在在线| 亚洲精品福利在线观看| 91精品久久久久久久久久久久久| 欧美精品videossex88| 国产精品综合网站| 久久精品亚洲94久久精品| 91在线视频成人| 一区二区三区四区在线观看视频| 国产精品久久久久久久久久免费| 亚洲自拍另类欧美丝袜| 欧美日韩国产一中文字不卡| 中文字幕一区二区精品| 97在线视频精品| 成人av色在线观看| 国产精品夜间视频香蕉| 亚洲国产精品专区久久| 国产成人精品网站| 高清视频欧美一级| 大桥未久av一区二区三区| 黑人巨大精品欧美一区二区三区| 久久国产精品免费视频| 欧美日韩精品二区| 欧洲美女免费图片一区| 亚洲视频axxx| 久久不射热爱视频精品| 中日韩午夜理伦电影免费| 亚洲精品98久久久久久中文字幕| 狠狠色香婷婷久久亚洲精品| 欧美成人合集magnet| 欧美成人性色生活仑片| 8050国产精品久久久久久| 欧美在线性爱视频| 日韩av高清不卡| 日韩精品中文字幕在线播放| 免费成人高清视频| 国产成人精品视频在线| 亚洲一区二区免费| 97精品久久久| 国产精品九九九| 国产精品美女久久久久av超清| 亚洲欧洲第一视频| 亚洲丝袜av一区| 色婷婷综合成人av| 亚洲精品国产suv| 亚洲精品suv精品一区二区| 精品久久久久久中文字幕大豆网| 日韩福利视频在线观看| 亚洲天堂2020| 午夜精品福利视频| 日韩成人免费视频| 日韩中文有码在线视频| 91在线高清免费观看| 久久99青青精品免费观看| 亚洲色图激情小说| 亚洲欧洲第一视频| 草民午夜欧美限制a级福利片| 亚洲日韩欧美视频一区| 91精品成人久久| 日韩二区三区在线| 国产v综合v亚洲欧美久久| 亚洲性夜色噜噜噜7777| 日韩av电影国产| 夜夜躁日日躁狠狠久久88av| 国产精品高潮呻吟久久av野狼| 国产精品福利小视频| 欧美激情精品久久久久久黑人| 亚洲人午夜色婷婷| 伦理中文字幕亚洲| 国产精品成人观看视频国产奇米| 亚洲精品白浆高清久久久久久| 亚洲福利在线播放| 精品中文字幕在线观看| 91av成人在线| 久久夜精品香蕉| 日韩亚洲欧美中文高清在线| 欧美在线视频a| 91免费的视频在线播放| 色偷偷噜噜噜亚洲男人的天堂| 亚洲韩国日本中文字幕| 亚洲人午夜精品免费| 亚洲欧美另类在线观看| 日韩电影中文字幕av| 91精品久久久久久久久青青| 亚洲黄色免费三级| 亚洲图片在线综合| 91在线直播亚洲| 丝袜亚洲另类欧美重口| 色午夜这里只有精品| 欧美激情手机在线视频| 韩国一区二区电影| 中文字幕在线观看日韩| 日韩在线小视频| 2024亚洲男人天堂| 国产性色av一区二区| 中文字幕日本精品| 成人在线观看视频网站| 久久久这里只有精品视频| 深夜福利亚洲导航| 久国内精品在线| 国产免费成人av| 亚洲精品国产福利| 欧美大尺度电影在线观看| 亚洲国产欧美精品| 午夜精品久久久久久久白皮肤| 国产一区二区三区中文| 亚洲a在线播放| 精品中文字幕乱| 亚洲精品少妇网址| 中文字幕日本欧美| 97国产在线视频| 98精品国产高清在线xxxx天堂| 日本久久久久亚洲中字幕| 日韩av在线免费观看一区| 国产午夜精品一区二区三区| 久久国产精品视频| 国产精品免费福利| 色爱精品视频一区| 欧美亚洲另类制服自拍| 欧美美女15p| 久久久久亚洲精品国产| 国语自产精品视频在线看一大j8| 欧美精品一区在线播放| 国产精品高精视频免费| 不用播放器成人网| 亚洲二区在线播放视频| 国产精品久久久久不卡| 久久精品最新地址| 国产精品96久久久久久又黄又硬| 国产亚洲aⅴaaaaaa毛片| 国产成人精品久久亚洲高清不卡| 国产伊人精品在线| 91久久久久久久一区二区|