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)死當的情況
所以使用多執行緒下載