1

我正在下载 .mp3 文件,我的目标是在下载过程中甚至没有最低限度的 GUI 冻结。我的目标也是在进度条和标签中显示收到的叮咬。此代码正在运行,但有时会无缘无故地冻结,有时进度条在文件完全完成之前不起作用。到目前为止,这是我在网上找到的“最佳”代码,用于在下载过程中完全工作的进度条,但仍然存在问题。你觉得我怎样才能提高成绩?如何制作耐久且可靠的工作进度条?如何在不冻结 GUI 的情况下下载大文件?我尝试(好奇)下载一个 600 mb 的文件,它完全冻结,没有响应,也没有给出任何问题。谢谢

EDIT1:我正在尝试这个,即使我迷失在高浪中。关于如何使用此代码并将其插入Jimi 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

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

我真的迷失了,我试图删除取消下载,因为我不会停止任何下载,并且我还尝试每 1 秒从 url 删除一次下载,因为我只需要为每个链接下载一次。谢谢

4

0 回答 0