在vb.net中保存/加载BackgroundWorker进度

时间:2016-09-21 10:41:03

标签: vb.net

我正在使用backgroundworker&创建文件下载程序我想保存backgroundworker的进度,这样当我重新启动应用程序时,在恢复时,它会在上次关闭时开始下载。

有任何帮助吗? 这是我的Downloader代码

Public Class cls_FileDownloader
Dim FileSave As String
Delegate Sub DownloadFIlesafe(ByVal Cancelled As Boolean)
Delegate Sub ChangeTextsSafe(ByVal length As Long, ByVal position As Double, ByVal percent As Long, ByVal speed As Long)
Private Sub cls_FileDownloader_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Label1.Text = ""
    btn_Cancel.Enabled = False

End Sub

Private Sub btn_Download_Click(sender As Object, e As EventArgs) Handles btn_Download.Click
    If Me.txt_Url.Text <> "" Then
        Me.SaveFile.FileName = txt_Url.Text.Split("\"c)(txt_Url.Text.Split("\"c).Length - 1)
        If SaveFile.ShowDialog = System.Windows.Forms.DialogResult.OK Then
            FileSave = SaveFile.FileName
            SaveFile.FileName = ""
            lbl_SaveTO.Text = "Save To:" & FileSave

            txt_Url.Enabled = False
            btn_Download.Enabled = False
            btn_Cancel.Enabled = True

            bg_Worker.RunWorkerAsync()
        End If
    Else
        MessageBox.Show("Please Insert valid file path", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)

    End If

End Sub

Private Sub bg_Worker_DoWork(sender As Object, e As DoWorkEventArgs) Handles bg_Worker.DoWork

    Dim response As FileWebResponse
    Dim request As FileWebRequest
    Try
        request = WebRequest.Create(txt_Url.Text)
        response = request.GetResponse

    Catch ex As Exception
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Dim cancelDelegate As New DownloadFIlesafe(AddressOf Download_Complete)
        Me.Invoke(cancelDelegate, True)
        Exit Sub
    End Try

    Dim length As Long = response.ContentLength
    Dim safedelegate As New ChangeTextsSafe(AddressOf ChangeTexts)
    Me.Invoke(safedelegate, length, 0, 0, 0)
    Dim writeStream As New IO.FileStream(Me.FileSave, IO.FileMode.Create)


    Dim nRead As Double

    'To calculate the download speed
    Dim speedtimer As New Stopwatch
    Dim currentspeed As Long = -1
    Dim readings As Integer = 0

    Do

        If bg_Worker.CancellationPending Then 'If user abort download
            Exit Do
        End If

        speedtimer.Start()

        Dim readBytes(4095) As Byte
        Dim bytesread As Long = response.GetResponseStream.Read(readBytes, 0, 4096)

        nRead += bytesread
        Dim percent As Long = (nRead * 100) / length

        Me.Invoke(safedelegate, length, nRead, percent, currentspeed)

        If bytesread = 0 Then Exit Do

        writeStream.Write(readBytes, 0, bytesread)

        speedtimer.Stop()

        readings += 1
        If readings >= 5 Then 'For increase precision, the speed it's calculated only every five cicles
            currentspeed = 20480 / (speedtimer.ElapsedMilliseconds / 1000)
            speedtimer.Reset()
            readings = 0
        End If
    Loop

    'Close the streams
    response.GetResponseStream.Close()
    writeStream.Close()
    If Me.bg_Worker.CancellationPending Then

        IO.File.Delete(Me.FileSave)

        Dim cancelDelegate As New DownloadFIlesafe(AddressOf Download_Complete)

        Me.Invoke(cancelDelegate, True)

        Exit Sub

    End If

    Dim completeDelegate As New DownloadFIlesafe(AddressOf Download_Complete)

    Me.Invoke(completeDelegate, False)


End Sub

0 个答案:

没有答案