【问题标题】:WPF asynchronous invoke questionWPF异步调用问题
【发布时间】:2011-03-16 12:51:57
【问题描述】:

我的代码有什么问题?删除文件时不会更新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

【问题讨论】:

    标签: wpf asynchronous progress-bar dispatcher begininvoke


    【解决方案1】:

    我得到了这个与 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-24
      • 2016-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      • 2015-07-30
      • 2019-08-04
      相关资源
      最近更新 更多