2010-07-15 20 views
0

Qu'est-ce qui ne va pas dans mon code? Il ne met pas à jour le TextBox et le ProgressBar lors de la suppression de fichiers.Question d'invocation asynchrone WPF

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 

Répondre

0

J'ai obtenu ce travail avec l'objet BackgroundWorker. Cela place votre travail dans un fil d'arrière-plan, avec des appels pour mettre à jour l'interface utilisateur en passant par l'événement ProgressChanged. J'ai également utilisé Invoke au lieu de BeginInvoke dans la boucle de travail, ce qui force la boucle à attendre que l'interface utilisateur soit mise à jour avant de continuer.

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