vb.net winforms download without blocking

229 Views Asked by At

I'm downloading files .mp3 and my goal is not to have even a minimum GUI freezing during downloading. My aim is also to display the bites received in a progress bar and through labels. This code is working, but sometimes is freezing without any reason, sometimes the progress bar doesn't work until file is completely done. So far, this is the "best" code I found online for a completely working progress bar during a download, but still gets problems. How do you think I can increase performances? How can I make a resistant and reliable working progressbar? How can I download also large file without GUI freezing? I tried (curiosity) to download a 600 mb file and it completely freeze, not responding and not giving any issue back. Thanks

EDIT1: I'm trying with this,eventhough I'm lost on high waves.. Any idea on how can I use this code and insert it into Jimi Answer? Answer


Imports System.IO
Imports System.IO.Path
Imports System.Net



Public Class Form1
  Private downloader As MyDownloader = Nothing

  Private Sub btnStartDownload_Click(sender As Object, e As EventArgs) Handles btnStartDownload.Click
      Dim progress = New Progress(Of String)(
          Sub(data)

              MsgBox("we are on the UI thread here")
          End Sub)

      Dim url As Uri = New Uri(TextBox1.Text)
      downloader = New MyDownloader()
      'How can I remove this second? I don't need download from url every 1 second. 
      downloader.StartDownload(progress, url, 1)

  End Sub

And

Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Net
Imports System.Net.Http
Imports System.Text.RegularExpressions
Imports System.Threading

Public Class MyDownloader
    Private Shared ReadOnly client As New HttpClient()
            client.DownloadProgressChanged += AddressOf Client_DownloadProgressChanged
            client.DownloadFileCompleted += AddressOf Client_DownloadFileCompleted
    Private interval As Integer = 0
    Private Sub Client_DownloadFileCompleted(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)
        System.Windows.Forms.MessageBox.Show("Download OK!", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub
    Public Sub StartDownload(progress As IProgress(Of String), url As Uri, intervalSeconds As Integer)
        interval = intervalSeconds * 1000
        Task.Run(Function() DownloadAsync(progress, url))
    End Sub
    Private Sub Client_DownloadProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
        ProgressBar1.Minimum = 0
        Dim receive As Double = Double.Parse(e.BytesReceived.ToString())
        Dim total As Double = Double.Parse(e.TotalBytesToReceive.ToString())
        Dim percentage As Double = receive / total * 100
        label2.Text = $"{String.Format("{0:0.##}", percentage)}%"
        ProgressBar1.Value = Integer.Parse(Math.Truncate(percentage).ToString())
    End Sub
    Private Async Function DownloadAsync(progress As IProgress(Of String), url As Uri) As Task
        Dim pattern As String = "<(?:[^>=]|='[^']*'|=""[^""]*""|=[^'""][^\s>]*)*>"
        Dim downloadTimeWatch As Stopwatch = New Stopwatch()
        downloadTimeWatch.Start()
        Do
            Try
                Dim response = Await client.GetAsync(url, HttpCompletionOption.ResponseContentRead)
                Dim data = Await response.Content.ReadAsStringAsync()

                data = WebUtility.HtmlDecode(Regex.Replace(data, pattern, ""))
                progress.Report(data)

                Dim delay = interval - CInt(downloadTimeWatch.ElapsedMilliseconds)
                Await Task.Delay(If(delay <= 0, 10, delay))
                downloadTimeWatch.Restart()

            Catch ex As Exception
            End Try
        Loop
    End Function
End Class

I'm Seriously lost on it, I tried to delete cancel download as I am not going to stop any download and I tried also to delete Download from url every 1 second as I just need one time download for every link. Thanks

0

There are 0 best solutions below