vb.net 获取HTTP下载文件的进度

时间:2021-07-21 14:00:11
老师好!
      我有如下代码,下载HTTP文件用的,怎么才能得到即时下载进度呢?

Dim myWebClient As WebClient

 Private Sub DownLoadFiles()
    myWebClient = New WebClient
    AddHandler myWebClient.DownloadProgressChanged, AddressOf ShowDownProgress 这一句是在网上看到的,用这句来捕获下载进度变化事件,不知道对不对。
    myWebClient.DownloadFile("http://mir3.clientdown.sdo.com/Mir3/Full_Mir3_Setup_V1.0.0.22.exe", "Full_Mir3_Setup_V1.0.0.22.exe")
  End Sub

DownLoadFiles  方法是通过线程启动的,如下:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    downThread = New Thread(AddressOf DownLoadFiles)
    downThread.Start()
  End Sub


求大神指点!

11 个解决方案

#1


你已经绑定了 ShowDownProgress 进度变化的方法了, 这个方法的参数 e.ProgressPercentage就是下载的进度值, 你可以得到这个值让他显示出来或者放到进度条中就能知道进度变化了

#2


不行,比如像下面这样:
Private Sub ShowDownProgress(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
    ProgressBar1.Value = e.BytesReceived
    Label1.Text = e.BytesReceived.ToString
  End Sub

Label1的Text属性没有发生变化,说明AddHandler myWebClient.DownloadProgressChanged, AddressOf ShowDownProgress 
没起作用,具体我也不是很清楚了,新手不懂啊。

#3


用不着画蛇添足的 Thread。WebClient 有一系列 xxxAsync 方法支持异步操作,这些都可以通过事件来捕获下载过程中的事件。

#4


用不着画蛇添足的 Thread。WebClient 有一系列 xxxAsync 方法支持异步操作,这些都可以通过事件来捕获下载过程中的事件。

#5


引用 2 楼 szmsolo 的回复:
不行,比如像下面这样:
Private Sub ShowDownProgress(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
    ProgressBar1.Value = e.BytesReceived
    Label1.Text = e.BytesReceived.ToString
  End Sub

Label1的Text属性没有发生变化,说明AddHandler myWebClient.DownloadProgressChanged, AddressOf ShowDownProgress 
没起作用,具体我也不是很清楚了,新手不懂啊。

你用我给你的参数试试

#6


引用
#5

我的全部代码如下,很简单的:
Imports System.Net
Imports System.IO
Imports System.Threading
Public Class Form1
  Dim downThread As Thread
  Dim myWebClient As WebClient

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    downThread = New Thread(AddressOf DownLoadFiles)
    downThread.Start()
  End Sub

  Private Sub ShowDownProgress(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
    ProgressBar1.Value = e.ProgressPercentage
  End Sub

  Private Sub DownLoadFiles()
    myWebClient = New WebClient
    AddHandler myWebClient.DownloadProgressChanged, AddressOf ShowDownProgress
    myWebClient.DownloadFile("http://mir3.clientdown.sdo.com/Mir3/Full_Mir3_Setup_V1.0.0.22.exe", "Full_Mir3_Setup_V1.0.0.22.exe")
  End Sub

  Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    downThread.Abort()
  End Sub

End Class

老师们帮我看看我要如何得到即时下载的进度?

#7


引用 6 楼 szmsolo 的回复:
引用
#5

我的全部代码如下,很简单的:
Imports System.Net
Imports System.IO
Imports System.Threading
Public Class Form1
  Dim downThread As Thread
  Dim myWebClient As WebClient

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    downThread = New Thread(AddressOf DownLoadFiles)
    downThread.Start()
  End Sub

  Private Sub ShowDownProgress(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
    ProgressBar1.Value = e.ProgressPercentage
  End Sub

  Private Sub DownLoadFiles()
    myWebClient = New WebClient
    AddHandler myWebClient.DownloadProgressChanged, AddressOf ShowDownProgress
    myWebClient.DownloadFile("http://mir3.clientdown.sdo.com/Mir3/Full_Mir3_Setup_V1.0.0.22.exe", "Full_Mir3_Setup_V1.0.0.22.exe")
  End Sub

  Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    downThread.Abort()
  End Sub

End Class

老师们帮我看看我要如何得到即时下载的进度?

看你的代码没什么问题 , 进度条显示的因为在线程里面所以得用委托调用,这是我用你的代码稍作改动 你可以看看
vb.net 获取HTTP下载文件的进度

#8




    Dim myWebClient As WebClient
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        myWebClient = New WebClient
        AddHandler myWebClient.DownloadProgressChanged, AddressOf ShowDownProgress '这一句是在网上看到的,用这句来捕获下载进度变化事件,不知道对不对。
        AddHandler myWebClient.DownloadDataCompleted, AddressOf DownloadDataCompleted
    End Sub

    Private Sub DownLoadFiles()  
        myWebClient.DownloadFileAsync(New Uri("http://dlsw.baidu.com/sw-search-sp/soft/3a/12350/QQ_V7.6.15742.0_setup.1441010663.exe"), "QQ_V7.6.15742.0_setup.1441010663.exe")
    End Sub

    Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
        DownLoadFiles()
    End Sub

    '这里是进度条显示
    Private Sub ShowDownProgress(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
        Invoke(New Action(Of Integer)(Sub(i) ProgressBar1.Value = i), e.ProgressPercentage)
    End Sub

    '这里是完成部分
    Sub DownloadDataCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)

        If MessageBox.Show("您已经下载成功,是否打开应用程序?", "提示", MessageBoxButtons.YesNo) = DialogResult.Yes Then

            System.Diagnostics.Process.Start("QQ_V7.6.15742.0_setup.1441010663.exe") ' 启动刚下载的程序

        Else


        End If

    End Sub

#9


引用 8 楼 running_crazy 的回复:


    Dim myWebClient As WebClient
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        myWebClient = New WebClient
        AddHandler myWebClient.DownloadProgressChanged, AddressOf ShowDownProgress '这一句是在网上看到的,用这句来捕获下载进度变化事件,不知道对不对。
        AddHandler myWebClient.DownloadDataCompleted, AddressOf DownloadDataCompleted
    End Sub

    Private Sub DownLoadFiles()  
        myWebClient.DownloadFileAsync(New Uri("http://dlsw.baidu.com/sw-search-sp/soft/3a/12350/QQ_V7.6.15742.0_setup.1441010663.exe"), "QQ_V7.6.15742.0_setup.1441010663.exe")
    End Sub

    Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
        DownLoadFiles()
    End Sub

    '这里是进度条显示
    Private Sub ShowDownProgress(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
        Invoke(New Action(Of Integer)(Sub(i) ProgressBar1.Value = i), e.ProgressPercentage)
    End Sub

    '这里是完成部分
    Sub DownloadDataCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)

        If MessageBox.Show("您已经下载成功,是否打开应用程序?", "提示", MessageBoxButtons.YesNo) = DialogResult.Yes Then

            System.Diagnostics.Process.Start("QQ_V7.6.15742.0_setup.1441010663.exe") ' 启动刚下载的程序

        Else


        End If

    End Sub


这一步可以不用委托  上面的老师说的对, 有线程要开委托, 没线程就不用委托了

    '这里是进度条显示
    Private Sub ShowDownProgress(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
        ProgressBar1.Value = e.ProgressPercentage
    End Sub

#10


搞定了,谢谢两位老师!

#11


感谢分享,但用了你们的程序,程序下载完了为什么没有弹出提示框呢,求指教。

#1


你已经绑定了 ShowDownProgress 进度变化的方法了, 这个方法的参数 e.ProgressPercentage就是下载的进度值, 你可以得到这个值让他显示出来或者放到进度条中就能知道进度变化了

#2


不行,比如像下面这样:
Private Sub ShowDownProgress(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
    ProgressBar1.Value = e.BytesReceived
    Label1.Text = e.BytesReceived.ToString
  End Sub

Label1的Text属性没有发生变化,说明AddHandler myWebClient.DownloadProgressChanged, AddressOf ShowDownProgress 
没起作用,具体我也不是很清楚了,新手不懂啊。

#3


用不着画蛇添足的 Thread。WebClient 有一系列 xxxAsync 方法支持异步操作,这些都可以通过事件来捕获下载过程中的事件。

#4


用不着画蛇添足的 Thread。WebClient 有一系列 xxxAsync 方法支持异步操作,这些都可以通过事件来捕获下载过程中的事件。

#5


引用 2 楼 szmsolo 的回复:
不行,比如像下面这样:
Private Sub ShowDownProgress(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
    ProgressBar1.Value = e.BytesReceived
    Label1.Text = e.BytesReceived.ToString
  End Sub

Label1的Text属性没有发生变化,说明AddHandler myWebClient.DownloadProgressChanged, AddressOf ShowDownProgress 
没起作用,具体我也不是很清楚了,新手不懂啊。

你用我给你的参数试试

#6


引用
#5

我的全部代码如下,很简单的:
Imports System.Net
Imports System.IO
Imports System.Threading
Public Class Form1
  Dim downThread As Thread
  Dim myWebClient As WebClient

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    downThread = New Thread(AddressOf DownLoadFiles)
    downThread.Start()
  End Sub

  Private Sub ShowDownProgress(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
    ProgressBar1.Value = e.ProgressPercentage
  End Sub

  Private Sub DownLoadFiles()
    myWebClient = New WebClient
    AddHandler myWebClient.DownloadProgressChanged, AddressOf ShowDownProgress
    myWebClient.DownloadFile("http://mir3.clientdown.sdo.com/Mir3/Full_Mir3_Setup_V1.0.0.22.exe", "Full_Mir3_Setup_V1.0.0.22.exe")
  End Sub

  Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    downThread.Abort()
  End Sub

End Class

老师们帮我看看我要如何得到即时下载的进度?

#7


引用 6 楼 szmsolo 的回复:
引用
#5

我的全部代码如下,很简单的:
Imports System.Net
Imports System.IO
Imports System.Threading
Public Class Form1
  Dim downThread As Thread
  Dim myWebClient As WebClient

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    downThread = New Thread(AddressOf DownLoadFiles)
    downThread.Start()
  End Sub

  Private Sub ShowDownProgress(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
    ProgressBar1.Value = e.ProgressPercentage
  End Sub

  Private Sub DownLoadFiles()
    myWebClient = New WebClient
    AddHandler myWebClient.DownloadProgressChanged, AddressOf ShowDownProgress
    myWebClient.DownloadFile("http://mir3.clientdown.sdo.com/Mir3/Full_Mir3_Setup_V1.0.0.22.exe", "Full_Mir3_Setup_V1.0.0.22.exe")
  End Sub

  Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    downThread.Abort()
  End Sub

End Class

老师们帮我看看我要如何得到即时下载的进度?

看你的代码没什么问题 , 进度条显示的因为在线程里面所以得用委托调用,这是我用你的代码稍作改动 你可以看看
vb.net 获取HTTP下载文件的进度

#8




    Dim myWebClient As WebClient
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        myWebClient = New WebClient
        AddHandler myWebClient.DownloadProgressChanged, AddressOf ShowDownProgress '这一句是在网上看到的,用这句来捕获下载进度变化事件,不知道对不对。
        AddHandler myWebClient.DownloadDataCompleted, AddressOf DownloadDataCompleted
    End Sub

    Private Sub DownLoadFiles()  
        myWebClient.DownloadFileAsync(New Uri("http://dlsw.baidu.com/sw-search-sp/soft/3a/12350/QQ_V7.6.15742.0_setup.1441010663.exe"), "QQ_V7.6.15742.0_setup.1441010663.exe")
    End Sub

    Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
        DownLoadFiles()
    End Sub

    '这里是进度条显示
    Private Sub ShowDownProgress(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
        Invoke(New Action(Of Integer)(Sub(i) ProgressBar1.Value = i), e.ProgressPercentage)
    End Sub

    '这里是完成部分
    Sub DownloadDataCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)

        If MessageBox.Show("您已经下载成功,是否打开应用程序?", "提示", MessageBoxButtons.YesNo) = DialogResult.Yes Then

            System.Diagnostics.Process.Start("QQ_V7.6.15742.0_setup.1441010663.exe") ' 启动刚下载的程序

        Else


        End If

    End Sub

#9


引用 8 楼 running_crazy 的回复:


    Dim myWebClient As WebClient
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        myWebClient = New WebClient
        AddHandler myWebClient.DownloadProgressChanged, AddressOf ShowDownProgress '这一句是在网上看到的,用这句来捕获下载进度变化事件,不知道对不对。
        AddHandler myWebClient.DownloadDataCompleted, AddressOf DownloadDataCompleted
    End Sub

    Private Sub DownLoadFiles()  
        myWebClient.DownloadFileAsync(New Uri("http://dlsw.baidu.com/sw-search-sp/soft/3a/12350/QQ_V7.6.15742.0_setup.1441010663.exe"), "QQ_V7.6.15742.0_setup.1441010663.exe")
    End Sub

    Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
        DownLoadFiles()
    End Sub

    '这里是进度条显示
    Private Sub ShowDownProgress(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
        Invoke(New Action(Of Integer)(Sub(i) ProgressBar1.Value = i), e.ProgressPercentage)
    End Sub

    '这里是完成部分
    Sub DownloadDataCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)

        If MessageBox.Show("您已经下载成功,是否打开应用程序?", "提示", MessageBoxButtons.YesNo) = DialogResult.Yes Then

            System.Diagnostics.Process.Start("QQ_V7.6.15742.0_setup.1441010663.exe") ' 启动刚下载的程序

        Else


        End If

    End Sub


这一步可以不用委托  上面的老师说的对, 有线程要开委托, 没线程就不用委托了

    '这里是进度条显示
    Private Sub ShowDownProgress(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
        ProgressBar1.Value = e.ProgressPercentage
    End Sub

#10


搞定了,谢谢两位老师!

#11


感谢分享,但用了你们的程序,程序下载完了为什么没有弹出提示框呢,求指教。