0

次を使用してファイルをダウンロードしています。

Dim client As WebClient = New WebClient()
client.DownloadFileAsync(New Uri("http://cachefly.cachefly.net/100mb.test"), "C:\Users\Dir\100mb.test")

ファイルがダウンロードされてに保存されますC://Users/Dir/100mb.testが、ダウンロード中にラベルにダウンロード速度を表示したいと思います。これどうやってするの?多くのチュートリアルを読みましたが、それらのほとんどは機能しないか、古くなっています。私はvb.netの初心者なので、自分で何かを書くことはできません。解決策を教えてください。

4

4 に答える 4

1

何か違うことを提案してもいいですか?

Imports System.Net

Public Class Form1

Private tmp = IO.Path.Combine(My.Computer.FileSystem.SpecialDirectories.Temp, "snafu.fubar")
Private Downloading As Boolean = False

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    If Downloading Then Exit Sub
    Downloading = True

    Dim wc As New WebClient
    AddHandler wc.DownloadProgressChanged, AddressOf wc_ProgressChanged
    AddHandler wc.DownloadFileCompleted, AddressOf wc_DownloadDone

    wc.DownloadFileAsync(New Uri("http://cachefly.cachefly.net/100mb.test"), tmp, Stopwatch.StartNew)

End Sub

Private Sub wc_DownloadDone(sender As Object, e As System.ComponentModel.AsyncCompletedEventArgs)
    Downloading = False
End Sub

Private Sub wc_ProgressChanged(sender As Object, e As DownloadProgressChangedEventArgs)
    Me.Label1.Text = (e.BytesReceived / (DirectCast(e.UserState, Stopwatch).ElapsedMilliseconds / 1000.0#)).ToString("#")
End Sub

End Class

受信した最後のバイト チャンクで速度を判断するのは意味がないため、代わりに合計バイト数を測定し、TOTAL 時間で割ります。ストップウォッチ インスタンスをイベント ハンドラに渡すと、クラス コードが「台無し」にならず、必要な場所にのみ表示されるという利点があります。

于 2012-11-23T22:54:31.963 に答える
0

グローバルを定義する:

Dim lastUpdate As DateTime
Dim lastBytes As Long = 0

進行状況を確認するには、イベントを割り当てる必要があります。

Dim client As WebClient = New WebClient()
client.DownloadFileAsync(New Uri("http://cachefly.cachefly.net/100mb.test"), "C:\Users\Dir\100mb.test")
client.DownloadProgressChanged += Function(sender, e) progressChanged(e.BytesReceived)

行事:

Private Sub progressChanged(bytes As Long)
    If lastBytes = 0 Then
        lastUpdate = DateTime.Now
        lastBytes = bytes
        Return
    End If

    Dim now = DateTime.Now
    Dim timeSpan = now - lastUpdate
    If Not timeSpan.Seconds = 0
         Dim bytesChange = bytes - lastBytes
         Dim bytesPerSecond = bytesChange / timeSpan.Seconds

         lastBytes = bytes
         lastUpdate = now
    End If
End Sub

そして、1秒あたりのバイト数の計算があります。

label.Text = bytesPerSecond.ToString() + "B/s"; 
于 2012-11-23T15:59:06.557 に答える
0

これにより、その間のパーセンテージが得られます。おそらく、DateTime.Now を使用して開始時間のパーセンテージから計算できますが、ダウンロードの速度は次のようになります。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Try

    Dim client As WebClient = New WebClient()
    AddHandler client.DownloadProgressChanged, AddressOf ProgChanged
    client.DownloadFileAsync(New Uri("http://cachefly.cachefly.net/100mb.test"), "C:\Users\Dir\100mb.test")

Catch ex As Exception
    MessageBox.Show(ex.Message)
End Try
End Sub

Private Sub ProgChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
        Dim progressPercentage As Integer = e.ProgressPercentage
End Sub
于 2012-11-23T16:00:35.263 に答える