2011-05-13 4 views
3

안녕하세요 저는 드라이브에서 파일과 폴더를 읽기 위해 사용되는 코드입니다 업데이트되지 등UI 다음</p> <p>, 빠른

문제가 백그라운드 스레드가 할 수 있다는 것입니다 그러나
Public Class LoadingBox 

    Public counter As ULong 
    Public OpenRecords As New Dictionary(Of String, MainWindow.records) 
    Public Path As String 
    Public Diskname As String 
    Private WithEvents BKWorker As New BackgroundWorker() 


    Public Sub New(ByVal _Path As String, ByVal _Diskname As String) 

     ' This call is required by the designer. 
     InitializeComponent() 

     ' Add any initialization after the InitializeComponent() call. 
     Path = _path 
     Diskname = _diskname 
    End Sub 

    Private Sub GetStructure(ByVal tempdir As String, ByVal ParentID As String, ByVal DiskName As String) 
     Dim maindir As DirectoryInfo = My.Computer.FileSystem.GetDirectoryInfo(tempdir) 
     For Each Dir As DirectoryInfo In maindir.GetDirectories 
      Try 
       Dim d As New MainWindow.records 
       d.Filename = Dir.Name 
       d.Folder = True 
       d.Rowid = Date.UtcNow.ToString() + counter.ToString() 
       d.Size = 0 
       d.ParentID = ParentID 
       d.DiskName = DiskName 
       d.DateCreated = Dir.CreationTimeUtc 
       d.DateModified = Dir.LastWriteTimeUtc 
       OpenRecords.Add(d.Rowid, d) 
       'Label1.Content = "Processing: " + Dir.FullName 
       BKWorker.ReportProgress(0, Dir.FullName) 
       counter = counter + 1 
       GetStructure(Dir.FullName, d.Rowid, DiskName) 
      Catch ex As Exception 

      End Try 


     Next 
     For Each fil As FileInfo In maindir.GetFiles 
      Try 
       Dim d As New MainWindow.records 
       d.Filename = fil.Name 
       d.Folder = False 
       d.Rowid = Date.UtcNow.ToString() + counter.ToString() 
       d.Size = fil.Length 
       d.ParentID = ParentID 
       d.DiskName = DiskName 
       d.DateCreated = fil.CreationTimeUtc 
       d.DateModified = fil.LastWriteTimeUtc 
       OpenRecords.Add(d.Rowid, d) 
       'Label1.Content = "Processing: " + fil.FullName 
       BKWorker.ReportProgress(0, fil.FullName) 
       counter = counter + 1 
      Catch ex As Exception 

      End Try 

     Next 
    End Sub 

    Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded 
     counter = 0 
     BKWorker.WorkerReportsProgress = True 
     AddHandler BKWorker.DoWork, AddressOf BKWorker_Do 
     AddHandler BKWorker.ProgressChanged, AddressOf BKWorker_Progress 
     AddHandler BKWorker.RunWorkerCompleted, AddressOf BKWorker_Completed 
     BKWorker.RunWorkerAsync() 

     'GetStructure(Path, "0", Diskname) 
    End Sub 

    Private Sub BKWorker_Do(ByVal sender As Object, ByVal e As DoWorkEventArgs) 
     'Throw New NotImplementedException 
     GetStructure(Path, "0", Diskname) 
    End Sub 

    Private Sub BKWorker_Progress(ByVal sender As Object, ByVal e As ProgressChangedEventArgs) 
     'Throw New NotImplementedException 
     Label1.Content = "Processing: " + e.UserState.ToString() 
     If ProgressBar1.Value = 100 Then 
      ProgressBar1.Value = 0 
     End If 
     ProgressBar1.Value = ProgressBar1.Value + 1 
    End Sub 

    Private Sub BKWorker_Completed(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs) 
     'Throw New NotImplementedException 
     MessageBox.Show("Completed") 
     Me.Close() 
    End Sub 
End Class 

매우 빠르게 파일을 읽지 만 UI 스레드가 속도를 유지할 수 없다면이 문제를 해결할 수있는 방법에 대한 조언을 구할 수 있습니까?

답변

3

하나의 빠른 대답은 UI가 각 하나를 업데이트하려고 시도하지 않는 시간에 10 개의 파일이 처리되는 경우 일정 시간이 지나면 진행 상황을보고하는 것입니다. 일들이 그렇게 빨리 처리된다면 모든 파일 하나 하나를 업데이트 할 필요가 없습니다. 빠른 측면 노트에 또한

당신의 ProgressBar 실제로 0에서 방금 0

로 다시 초기화 한 후 비율을 높이고 대신 true로 IsIndeterminate 속성을 설정 할 수 있습니다 100 % 진행 상황을보고하지 않은 경우
+0

빠른 답장을 보내 주셔서 감사합니다. 귀하의 조언에 따라 해결하고 또한 IsIndeterminate, 유익한 주셔서 감사합니다 지적했다. – surpavan

+0

25 개의 파일이 나를 위해 가장 잘 작동했습니다. 고마워. – surpavan

4

많은 항목을 반복 할 때 모든 단일 항목에 대한 진행 상황을보고하고 싶지는 않습니다.

진행 상황을보고하기 전에 기다려야 할 합리적인 수의 파일을 찾는 것이 좋습니다. 매 5 일마다 또는 매 10 일마다. 정상적인 파일 수가 무엇인지 살펴보고 싶을 것입니다. 즉, 일반적으로 25 개의 파일 만 처리하는 경우 10 개의 파일을 모두 업데이트하고 싶지 않을 것입니다. 그러나 일반적으로 25000 개의 파일을 처리하는 경우 100 개의 파일 만 업데이트 할 수 있습니다.

+0

빠른 답장을 보내 주셔서 대단히 감사합니다. 귀하의 조언에 따라 해결. – surpavan

+0

25 개의 파일이 저에게 가장 잘 맞았습니다. 고마워. – surpavan

관련 문제