2011年5月22日

[VB] 實作HTTP檔案下載(多執行緒)



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)死當的情況

所以使用多執行緒下載

沒有留言:

張貼留言