程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#異步下載文件

C#異步下載文件

編輯:C#入門知識

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辦法遞歸的寫入文件流直到文件完整寫好為止。

以上就是本文的全體內容,願望對年夜家的進修有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved