0

プログラムの最新バージョンを Web から自動的にダウンロードするアップデーターを作成しようとしています。ここで、進行状況バーを使用してこのプロセスを実行したいと考えています (したがって、ダウンロードの進行状況が 50% の場合、進行状況バーは途中です)。これは私のコードです:

 Private Sub client_ProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
    Dim bytesIn As Double = Double.Parse(e.BytesReceived.ToString())
    Dim totalBytes As Double = Double.Parse(e.TotalBytesToReceive.ToString())
    Dim percentage As Double = bytesIn / totalBytes * 100

    client.Value = Int32.Parse(Math.Truncate(percentage).ToString())
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim url As String = "MY DOWNLOAD LINK"
    'Download
    Dim client As WebClient = New WebClient
    AddHandler client.DownloadProgressChanged, AddressOf client_ProgressChanged
    AddHandler client.DownloadFileCompleted, AddressOf client_DownloadCompleted
    client.DownloadFileAsync(New Uri(url), "C:\Users\User\Desktop\BACKUP\TESTING\New folder\1.exe")
End Sub
End Class

ファイルが保存されている場所は私が手動で入力したことがわかりましたが、後で変更します。現在、私の問題は、ファイルがダウンロードされていないことです。ただし、 DownloadFileAsync メソッドを DownloadFile に変更すると、プログラムはファイルをダウンロードします。ただし、DownloadFile メソッドでは、進行状況バーを使用してダウンロードの進行状況を追跡することはできません。どんな助けでも大歓迎です:-)

4

1 に答える 1

0

ファイルがダウンロードされていないと言うとき、あなたが何を意味するのかわかりませんか? エラー/例外が発生しましたか? まったく何も起こらない?ブレークポイント、debug.prints などを配置しましたか?

VS2012 と async/await を使用すると、すべてを 1 つのメソッドにまとめて「線形コード フロー」を維持できます。System.Threading および System.Threading.Tasks のインポート

Private Async Function DownloadWithProgress(ByVal url As String, ByVal p As ProgressBar) As Task(Of Integer)

    Dim wc As Net.HttpWebRequest = DirectCast(Net.HttpWebRequest.Create(url), Net.HttpWebRequest)
    Dim resp = Await (New TaskFactory(Of Net.WebResponse)).StartNew(AddressOf wc.GetResponse)
    p.Value = 0
    p.Maximum = CInt(resp.ContentLength)
    Dim rqs = resp.GetResponseStream


    Dim bufsize As Integer = 1 << 16
    Dim buffer(bufsize) As Byte
    Dim got As Integer = 0
    Dim total As Integer = 0
    Do
        got = Await (New TaskFactory(Of Integer)).FromAsync(AddressOf rqs.BeginRead, AddressOf rqs.EndRead, buffer, 0, bufsize, Nothing)
        total += got
        Me.Label1.Text = "got: " & total.ToString
        p.Increment(got)
    Loop Until got = 0

    Return total

End Function

このサンプルでは、​​Web からのデータが配列にダウンロードされますが、もちろんそれをファイルに書き込んだり、データに対して必要なことを行ったりすることもできます。

使用例:

Private running As Boolean = False
Private Async Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

    If running Then
        MessageBox.Show("Cant you see, I'm working?")
        Exit Sub
    Else
        running = True
    End If

    Await DownloadWithProgress("http://download.thinkbroadband.com/5MB.zip", ProgressBar1)
    running = False

End Sub
于 2013-10-18T21:50:47.260 に答える