
Imports System.Net Imports System.IO Imports System.Threading Public Class Form1 '跨執行緒使用的委派 Public Delegate Sub ChangeUpdate() Public Delegate Sub ChangeSet(ByVal max As Integer, ByVal min As Integer) private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '使用new thread產生執行緒 '使用Parameterized傳遞參數 Dim thread1 As New Thread(New ParameterizedThreadStart(AddressOf downFile)) thread1.Start(TextBox1.Text) End Sub Private Sub downFile(ByVal url As Object) Dim url2 As String = url.ToString() 'HttpWebRequest產生Http的請求並用HttpWebResponse接收 Dim request As HttpWebRequest = WebRequest.Create(url) Dim response As HttpWebResponse = request.GetResponse() '找尋Http標頭中的檔案長度 Dim length As Integer = Convert.ToInt32(response.GetResponseHeader("content-length")) '因為下載時不是用UI Thread,所以必須使用Invoke來改變ProgressBar的屬性 Me.Invoke(New ChangeSet(AddressOf SetBar), New Object() {length, 0}) '開啟一個檔案空間並命名為"test.jpg" '檔名可視下載檔案改變,或是解析下載網址來判斷 Dim fs As FileStream = New FileStream("test.jpg", FileMode.Create) Dim br As BinaryReader = New BinaryReader(response.GetResponseStream()) Dim bw As BinaryWriter = New BinaryWriter(fs) '開始讀取串流,邊讀邊寫入 For i = 0 To length - 1 bw.Write(br.ReadByte) '同樣因為不是UI Thread所以透過委派改變ProgressBar屬性 Me.Invoke(New ChangeUpdate(AddressOf UpdateBar)) Next br.Close() bw.Close() fs.Close() response.Close() End Sub Private Sub SetBar(ByVal max As Integer, ByVal min As Integer) ProgressBar1.Maximum = max ProgressBar1.Minimum = min End Sub Private Sub UpdateBar() ProgressBar1.Value = ProgressBar1.Value + 1 End Sub End Class
使用HttpWebRequest和HttpWebResponse下載Http協定的檔案
為了避免在下載時等待過久而造成主執行緒(UI Thread)死當的情況
所以使用多執行緒下載
沒有留言:
張貼留言