0

我的代码有什么问题?它不是在删除文件时更新TextBoxProgressBar删除文件。

Imports System.Windows.Threading
Imports System.IO
Class MainWindow
    Private Sub bt_Click(ByVal sender As Object,
        ByVal e As RoutedEventArgs) Handles bt.Click

        Dim sb As New System.Text.StringBuilder
        Dim files = IO.Directory.EnumerateFiles(
         My.Computer.FileSystem.SpecialDirectories.Temp, "*.*",
         SearchOption.TopDirectoryOnly)

        Dim count = files.Count

        pb.Minimum = 0
        pb.Maximum = count

        For i = 0 To count - 1
            Dim f = files(i)

            Dispatcher.BeginInvoke(
             New Action(Of String, Integer)(
             Sub(str, int)
                 tb.SetValue(TextBox.TextProperty, str)
                 pb.SetValue(ProgressBar.ValueProperty, int)
             End Sub),
            DispatcherPriority.Send,
            f, i + 1)

            Try
                File.Delete(f)
            Catch ex As Exception
                sb.AppendLine(f)
            End Try

            Dim exceptions = sb.ToString
            Stop
        Next

    End Sub
End Class
4

1 回答 1

0

我得到了这个与 BackgroundWorker 对象一起工作。这会将您的工作置于后台线程中,通过ProgressChanged事件调用更新 UI。我还在工作循环中使用了 Invoke 而不是 BeginInvoke,这会强制循环在继续之前等待 UI 更新。

Imports System.ComponentModel
Imports System.IO

Class MainWindow
    Private WithEvents bw As New BackgroundWorker

    Private Sub Button1_Click(ByVal sender As System.Object,
            ByVal e As RoutedEventArgs) Handles btn.Click
        pb.Minimum = 0
        pb.Maximum = 100
        bw.WorkerReportsProgress = True
        bw.RunWorkerAsync()
    End Sub

    Private Sub bw_DoWork(ByVal sender As Object,
             ByVal e As DoWorkEventArgs) Handles bw.DoWork
        Dim sb As New System.Text.StringBuilder
        Dim files = IO.Directory.EnumerateFiles(
         My.Computer.FileSystem.SpecialDirectories.Temp, "*.*",
         SearchOption.TopDirectoryOnly)

        Dim count = files.Count
        Me.Dispatcher.BeginInvoke(Sub()
                                      tb.Text = "SOMETHING ELSE"
                                  End Sub)
        For i = 0 To count - 1
            Dim f = files(i)
            Dim myI = i + 1
            Me.Dispatcher.Invoke(
                           Sub()
                               bw.ReportProgress(CInt((myI / count) * 100), f)
                           End Sub)

            'Try 
            '    File.Delete(f) 
            'Catch ex As Exception 
            '    sb.AppendLine(f) 
            'End Try 

            Dim exceptions = sb.ToString
            'Stop 
        Next
    End Sub


    Private Sub bw_ProgressChanged(
             ByVal sender As Object, 
             ByVal e As ProgressChangedEventArgs) Handles bw.ProgressChanged
        Dim fString As String = TryCast(e.UserState, String)
        Me.Dispatcher.BeginInvoke(Sub()
                                      tb.Text = fString
                                  End Sub)
    End Sub
End Class
于 2010-07-15T21:21:43.693 回答