1

ダウンロードサイトからファイルをダウンロードするプログラムを作成しています。大きなファイルをダウンロードすると通常 UI がフリーズするため、大きなファイルのダウンロードを処理するバックグラウンド ワーカーを作成しました。

私はそれを機能させることができましたが、現在直面している問題は、AddHandler を使用して変更された進行状況を表示できないことです。そのため、進行状況の変更された値に呼び出しメソッドを使用しようとしました。

これは、invoke メソッド用に試したコードです。

Dim ProgressChanged As New ProgressChange(AddressOf bw_ProgressChanged)
Me.Invoke(ProgressChanged, Nothing, EventArgs.Empty)

これは私の ProgressChanged ハンドラーです。

Private Sub bw_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
    ProgressBarCurrent.Value = Int32.Parse(Math.Truncate(percentage).ToString())

    Dim BytesDownloaded As String = (e.BytesReceived / (DirectCast(e.UserState, Stopwatch).ElapsedMilliseconds / 1000.0#)).ToString("#")

    If BytesDownloaded < 1024 Then
        Dim Bs As String = Convert.ToInt32(BytesDownloaded)
        Label4.Text = (Bs & " B/s")
    ElseIf BytesDownloaded < 1048576 Then
        Dim KBs As String = Math.Round(BytesDownloaded / 1024, 2)
        Label4.Text = (KBs & " KB/s")
    ElseIf BytesDownloaded < 1073741824 Then
        Dim MBs As String = Math.Round(BytesDownloaded / 1048576, 2)
        Label4.Text = (MBs & " MB/s")
    ElseIf BytesDownloaded < 1099511627776 Then
        Dim GBs As String = Math.Round(BytesDownloaded / 1073741824, 2)
        Label4.Text = (GBs & " GB/s")
    Else
        Label4.Text = ("Estimating...")
    End If
End Sub

もう少しコードがありますが、表示する必要はないと思います。

そして、これは私の代理サブです。

Delegate Sub ProgressChange(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)

また、 addhandler メソッドでいくつかの異なることを試しました。

AddHandler wc.DownloadProgressChanged, AddressOf bw_ProgressChanged

このコードを使用する前はエラーが発生していましたが、使用するとエラーは発生しませんが、コードは実際には何も実行されません。

DownloadProgressChanged に Invoke メソッドを使用できるかどうかはわかりませんでしたが、そうすべきだと信じており、どの引数を使用するかはわかりません。うまくいくと思ったさまざまな議論を試みましたが、うまくいきませんでした。

4

1 に答える 1

0

内部から[YourBackgroundWorkerObject].ReportProgressを呼び出す必要がありますDoWork。これにより、ProgressChanged イベントがトリガーされます。
その後、ProgressChanged プロシージャは、UI の変更を行うメソッドを呼び出す必要があります。
(ところで、BGW の Progress-Reporting-Reroute をスキップすることもできます。独自の UI 変更メソッドを から直接呼び出しますDoWork。)

于 2013-08-18T16:06:58.417 に答える