2014-09-24 137 views
0

我正在研究掃描用戶定義的目錄並提取所有文件擴展名的實用程序。
在下面提到的按鈕事件中,我開始執行所有掃描的線程,但是我希望代碼在'A點'暫停或停止,直到該線程完成其工作,而現在它啓動線程並在'A點'。如何停止代碼繼續?當線程啓動時掛起其他線程Vb.Net

Private Sub Btn_Extract_Click(sender As Object, e As EventArgs) Handles Btn_Extract.Click 
    Dim eventobject As New EventsandFunctions 
    eventobject.FilesCounter = 0 
    eventobject.DirectoryCounter = 0 
    AddHandler eventobject.FilesScanned, AddressOf eventobject.FilesScannedCounterIncrease 
    AddHandler eventobject.DirectoryScanned, AddressOf eventobject.DirectoryScannedCounterIncrease 
    If TxtB_SaveFilePath.Text = Nothing Or TxtBx_DirectoryToScan.Text = Nothing Then 
     MessageBox.Show("Scan Path, Output File Path or Both Missing", "Error") 
    Else 

     ThreadFileScanning.Start(eventobject) 'Thread Starts here--<Point A> 
     If ChckB_RemoveDot.Checked Then 
      eventobject.WriteExtentionsToFileWithoutDot(TxtB_SaveFilePath.Text) 
     Else 
      eventobject.WriteExtentionsToFile(TxtB_SaveFilePath.Text) 
     End If 
     MessageBox.Show("Operation Completed Successfully." & vbCrLf & vbCrLf & "Total Directory Scanned: " & eventobject.DirectoryCounter & vbCrLf & "Total Files Scanned: " & eventobject.FilesCounter, "Completion Notification") 
     Lbl_FileNames.Text = "Scanning & Writing Completed" 
    End If 
    Process.Start("notepad.exe", TxtB_SaveFilePath.Text) 

End Sub 

以下是這就是所謂的線程功能:

Public Sub RecursivelyScanFiles(ByVal Path As String, ByVal ObjectDb As DialogueBox) 

    If Path <> Nothing Then 
     For Each File In GetFiles(Path) 
      If File.Length < 260 Then 
       If System.IO.Path.HasExtension(File) = True Then 
        Extentions.Add(System.IO.Path.GetExtension(File).ToLower) 
       End If 
       ObjectDb.settext(File) 'Cross-Thread call Through a Delegate 
       ObjectDb.Refreshlabel() 'Cross-Thread call Through a Delegate 
       RaiseEvent FilesScanned(Me, EventArgs.Empty) 
      End If 
     Next 
    End If 
    If Path <> Nothing Then 
     For Each SubDir In GetDirectories(Path) 
      If SubDir.Length < 248 Then 
       Try 
        RaiseEvent DirectoryScanned(Me, EventArgs.Empty) 
        RecursivelyWriteToFile(SubDir, ObjectDb) 
       Catch ex As UnauthorizedAccessException 
        Continue For 
       Catch ex As Exception 
        MessageBox.Show(ex.ToString) 
       End Try 
      End If 
     Next 
    End If 
End Sub 
+0

你在問錯誤的問題,代碼有太多的問題需要刺探答案。使用BackgroundWorker類可避免發生最基本的錯誤,其RunWorkerCompleted和ProgressChanged事件可幫助您陷入成功之坑。 – 2014-09-24 15:09:36

+0

我在MSDN上閱讀了關於BackgroundWorker的內容,但我認爲使用委託更容易。你建議BackgroundWorker? – Rehan 2014-09-24 15:13:04

+0

我同意@HansPassant。在可能的情況下,應該使用後臺工作者,但由於線程問題,我已經給出了一個應該與線程一起工作的答案(如果我正確理解問題) – Grahamvs 2014-09-24 15:23:14

回答

0

創建一個全局布爾(isBusy),並將其設置爲True當線程開始,然後將其設置爲False當線程完成,如下所示:

Private isBusy as Boolean = False 

Private Sub Btn_Extract_Click(sender As Object, e As EventArgs) Handles Btn_Extract.Click 

    ' Other code goes here 

    ThreadFileScanning.Start(eventobject) 'Thread Starts here--<Point A> 

    ' This will prevent the thread from continuing 
    ' while the ThreadFileScanning is busy 
    While isBusy 
     Threading.Thread.Sleep(200) 
    End While 

    If ChckB_RemoveDot.Checked Then 
     eventobject.WriteExtentionsToFileWithoutDot(TxtB_SaveFilePath.Text) 
    Else 
     eventobject.WriteExtentionsToFile(TxtB_SaveFilePath.Text) 
    End If 

    ' rest of the code goes here 

End Sub 

Public Sub RecursivelyScanFiles(ByVal Path As String, ByVal ObjectDb As DialogueBox) 
    isBusy = True 

    ' Rest of code goes here 

    isBusy = False 
End Sub 

這將阻止第一個線程繼續,而RecursivelyScanFiles處於活動狀態。

+0

好主意! :)但我認爲漢斯比我們更有經驗,他建議別的。 – Rehan 2014-09-24 15:15:07

+0

忙碌的等待是一個相當糟糕的主意。已經有一種方法可以等待線程完成:'Thread.Join'。或者你可以使用某種「EventWaitHandle」。帶'布爾'標誌的'睡眠'循環是一個非常糟糕的主意。 – 2014-09-24 15:35:26

+0

這只是一個基本的想法,讓他開始......因爲它在UI線程上,所以可以相應地調整時間,並使用'application.DoEvents'(是的,我知道有些人不喜歡使用它)爲了保持程序的響應,並且可能會顯示進度條被設置爲連續的,所以用戶知道它沒有被凍結 – Grahamvs 2014-09-24 15:40:45