C#異步下載文件。本站提示廣大學習愛好者:(C#異步下載文件)文章只能為提供參考,不一定能成為您想要的結果。以下是C#異步下載文件正文
在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辦法遞歸的寫入文件流直到文件完整寫好為止。
以上就是本文的全體內容,願望對年夜家的進修有所贊助。