2010-07-15 113 views
0

我的代码有什么问题?它不会在删除文件时更新TextBoxProgressBarWPF异步调用问题

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 

回答

0

我得到了这个与BackgroundWorker对象的工作。这将您的工作置于后台线程中,通过调用来更新通过ProgressChanged事件的用户界面。我还在工作循环中使用了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