VB.Net程序设计:一个单独的线程-BackgroundWorker例子。搜索目录下的文件。

12 篇文章 1 订阅

 来源:Form: http://www.experts-exchange.com/Programming/Languages/.NET/Visual_Basic.NET/Q_22479449.html

This code sample assumes that the form has the following controls on it:( 需要的控件:)
TextBox called  txtSearchPath
TextBox called  txtSearchPattern 
Label   called    lblMessage
Button  called   btnStart 注意这个按钮的.text属性为:“Start”
ListBox called   lstFiles

Imports  System.IO

Public   Class SearchFilesFrm

    
' To set up for a background operation, add an event handler for the DoWork event. 
    ' Call your time-consuming operation in this event handler. To start the operation, 
    ' call RunWorkerAsync. To receive notifications of progress updates, handle the 
    ' ProgressChanged event. To receive a notification when the operation is completed, 
    ' handle the RunWorkerCompleted event.
    ' Note  
    ' You must be careful not to manipulate any user-interface objects in your DoWork 
    ' event handler. Instead, communicate to the user interface through the 
    ' ProgressChanged and RunWorkerCompleted events.
    ' If your background operation requires a parameter, call RunWorkerAsync with your 
    ' parameter. Inside the DoWork event handler, you can extract the parameter from 
    ' the DoWorkEventArgs.Argument property.

    
' Store the results of the search
    Private Files As List(Of String)
    
' Used to prevent nested calls to ProgressChanged 
    Private CallInProgress As Boolean
    
' The Worker thread
    Private WithEvents BgWorker As New System.ComponentModel.BackgroundWorker

    
Private Sub SearchFilesFrm_Load(ByVal sender As Object, _
        
ByVal e As System.EventArgs) Handles Me.Load

        
' Enable ProgressChanged and Cancellation mothed
        BgWorker.WorkerReportsProgress = True
        BgWorker.WorkerSupportsCancellation 
= True

    
End Sub


    
' Start and Stop the search
    Private Sub btnStart_Click(ByVal sender As System.Object, _
        
ByVal e As System.EventArgs) Handles btnStart.Click

        
If btnStart.Text = "Start" Then
            
If Not Directory.Exists(txtSearchPath.Text.Trim()) Then
                MessageBox.Show(
"The Search Directory does not exist", _
                    
"Path Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
                
Return
            
End If
            
If txtSearchPattern.Text.Trim() = "" Then txtSearchPattern.Text = "*"
            
Dim arguments() As String = {txtSearchPath.Text.Trim(), _
                txtSearchPattern.Text.Trim()}

            lstFiles.Items.Clear()
            
' Start the background worker thread. Thread runs in DoWork event.
            BgWorker.RunWorkerAsync(arguments)
            btnStart.Text 
= "Stop"
        
Else
            BgWorker.CancelAsync()
        
End If

    
End Sub


    
' Start the Asynchronous file search. The background thread does it work from
    ' this event.
    Private Sub BgWorker_DoWork(ByVal sender As Object, _
        
ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BgWorker.DoWork

        
'Retrieve the search path which was requested
        Dim path As String = DirectCast(e.Argument, String())(0)
        
Dim pattern As String = DirectCast(e.Argument, String())(1)

        
' Invoke the worker procedure
        Files = New List(Of String)
        SearchFiles(path, pattern)
        
' Return a result to the RunWorkerCompleted event
        Dim message As String = String.Format("Found {0} Files", Files.Count)
        e.Result 
= message

    
End Sub


    
' Recursively search directory and sub directories
    Private Sub SearchFiles(ByVal path As StringByVal pattern As String)

        
' Displat message
        Dim message As String = String.Format("Parsing Directory {0}", path)
        BgWorker.ReportProgress(
0, message)

        
'Read the files and if the Stop button is pressed cancel the operation
        For Each fileName As String In Directory.GetFiles(path, pattern)
            
If BgWorker.CancellationPending Then Return
            Files.Add(fileName)
        
Next
        
For Each dirName As String In Directory.GetDirectories(path)
            
If BgWorker.CancellationPending Then Return
            SearchFiles(dirName, pattern)
        
Next

    
End Sub


    
' The bacground thread calls this event when you make a call to ReportProgress
    ' It is OK to access user controls in the UI from this event.
    ' If you use a Progress Bar or some other control to report the tasks progress
    ' you should avoid unnecessary calls to ReportProgress method because this causes
    ' a thread switch which is a relatively expensive in terms of processing time.
    Private Sub BgWorker_ProgressChanged(ByVal sender As Object, _
        
ByVal e As System.ComponentModel.ProgressChangedEventArgs) _
        
Handles BgWorker.ProgressChanged

        
' Reject a nested call.
        If CallInProgress Then Return
        CallInProgress 
= True
        
' Display the message received in the UserState property
        lblMessage.Text = e.UserState.ToString()
        
' Display all files added since last call.
        For idx As Integer = lstFiles.Items.Count To Files.Count - 1
            lstFiles.Items.Add(Files(idx))
        
Next
        
' If a Me.Refresh is in this code you will need to place a Application.DoEvents()
        ' otherwise the UI will not respond without them it works fine.
        ' Me.Refresh()
        ' Let the Windows OS process messages in the queue
        ' Application.DoEvents()
        CallInProgress = False

    
End Sub


    
' The background thread calls this event just before it reaches the End Sub
    ' of the DoWork event. It is OK to access user controls in the UI from this event.
    Private Sub BgWorker_RunWorkerCompleted(ByVal sender As Object, _
        
ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) _
        
Handles BgWorker.RunWorkerCompleted

        
' Display the last message and reset the Start/Stop button text
        lblMessage.Text = e.Result.ToString()
        btnStart.Text 
= "Start"

    
End Sub


End Class


在win2k+vb.net 2005 测试过。不错。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值