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辦法遞歸的寫入文件流直到文件完整寫好為止。
以上就是本文的全體內容,願望對年夜家的進修有所贊助。