【问题标题】:Visual Basic Console Application Download Percentage?Visual Basic 控制台应用程序下载百分比?
【发布时间】:2012-12-03 21:11:41
【问题描述】:

我正在使用 DownloadFileAsync 下载一个更大的文件(1.3 GB),但我想添加一个简单的百分比指标(例如 64%)。我是 Visual Basic 新手,我不知道该怎么做。

任何帮助将不胜感激。

【问题讨论】:

    标签: vb.net download webclient


    【解决方案1】:

    WebClient 类有一个DownloadProgressChanged 事件,如果您想更新进度显示,可以收听该事件。例如,如果你有一个控制台应用程序,它很简单:

    Dim client As New WebClient()
    AddHandler client.DownloadProgressChanged, AddressOf ProgressUpdate
    client.DownloadFileAsync(yourURI, yourFile)
    
    Sub ProgressUpdate(sender As Object, e As DownloadProgressChangedEventArgs)
        ' Reset cursor position …
        Console.CursorTop -= 1
        Console.CursorLeft = 0
        Console.WriteLine("{0}% completed", e.ProgressPercentage)
    End Sub
    

    另一方面,如果您在 WinForms 项目中的 Form 上,并且您想要更新标签 ProgressLabel,则以下代码将执行此操作:

    Sub ProgressUpdate(sender As Object, e As DownloadProgressChangedEventArgs)
        Dim s = String.Format("{0}% completed", e.ProgressPercentage)
        Me.Invoke(New Action(Sub()
                                 ProgressLabel.Text = s
                             End Sub))
    End Sub
    

    ProgressUpdate 方法由于多线程而有点复杂:

    WebClient 正在后台线程中运行异步文件下载。但是,表单控件只能从运行表单的前台线程更新。因此,我们不能直接在ProgressUpdate 事件中更新标签(因为它也在被调用并运行在后台线程1)。

    所以我们改为使用Form.Invoke 方法,它保证我们想要执行的任何内容都在表单自己的线程中执行。我们将Action 委托传递给包含我们要执行的代码的Invoke 方法。而该代码只是在更新标签。


    1 至少我在文档中找不到任何其他说明 - 事件 可能 实际上在前台线程中执行,但在这种情况下,上面的代码仍然有效.

    【讨论】:

    • 是的,我知道这一点。但我正在使用控制台应用程序,我不知道如何在其中使用它。
    • @user1690292 在控制台应用程序中更容易,只需将百分比输出到控制台而不是标签。那么你也不需要通过Invoke绕道而行。
    • 能否请您为此写一个简短的示例,因为我不知道该怎么做。
    • 谢谢,但我怎样才能阻止控制台关闭。如果我输入Console.ReadLine,则百分比显示为两行。
    • 控制台仅在您通过按 F5 从 IDE 运行程序时才会关闭,因为 Visual Studio 和 Microsoft 是迟钝的。真正的控制台不会关闭。在 Visual Studio 中,您可以使用 Ctrl+F5 而不是 F5 来启动程序,以防止控制台关闭。
    猜你喜欢
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多