zoukankan      html  css  js  c++  java
  • Windows窗体应用程序中的线程处理-VB.Net

    代码
    Imports System.IO
    Imports System.Threading
    Imports System.ComponentModel

    Public Class Form1

       
    ' A delegate that can point to the ShowMessage procedure.
       Delegate Sub ShowMessageDelegate(ByVal msg As String)
       
    ' An instance of the delegate.
       Dim threadSafeDelegate As ShowMessageDelegate

       
    Private Sub btnSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearch.Click
          
    Dim t As New Thread(AddressOf SearchFiles)
          t.Start(
    "c:\windows")
       
    End Sub

       
    ' This method must run in the main UI thread.
       Sub ShowMessage(ByVal msg As String)
          
    ' Use the Invoke method only if necessary.
          If Me.InvokeRequired Then
             
    Me.Invoke(threadSafeDelegate, msg)
             
    Return
          
    End If

          
    Me.lblMessage.Text = msg
          
    Me.Refresh()
       
    End Sub

       
    ' (This method runs in a non-UI thread.)
       Sub SearchFiles(ByVal arg As Object)
          
    ' Retrieve the argument.
          Dim path As String = arg.ToString()
          
    ' Prepare the delegate
          threadSafeDelegate = New ShowMessageDelegate(AddressOf ShowMessage)
          
    ' Invoke the worker procedure. (The result isn't used in this demo.) 
          Dim files As List(Of String= GetFiles(path)
          
    ' Show that execution has terminated.
          Dim msg As String = String.Format("Found {0} files", files.Count)
          
    Me.Invoke(threadSafeDelegate, msg)
       
    End Sub

       
    ' A recursive function that retrieves all the files in a directory tree.
       ' (This method runs in a non-UI thread.)
       Function GetFiles(ByVal path As StringAs List(Of String)
          
    ' Display a message.
          Dim msg As String = String.Format("Parsing directory {0}", path)
          
    Me.Invoke(threadSafeDelegate, msg)

          
    ' Read the files in this folder and all subfolders.
          Dim files As New List(Of String)
          
    For Each fi As String In Directory.GetFiles(path)
             files.Add(fi)
          
    Next
          
    For Each di As String In Directory.GetDirectories(path)
             files.AddRange(GetFiles(di))
          
    Next
          
    Return files
       
    End Function

       
    ' backgroundworker demo

       
    ' The same button works as a Start and a Stop button.
       Private Sub btnStart_Click(ByVal sender As ObjectByVal e As EventArgs) _
             
    Handles btnStart.Click
          
    If btnStart.Text = "Start" Then
             lstFiles.Items.Clear()
             
    Me.BackgroundWorker1.RunWorkerAsync("c:\windows")
             
    Me.btnStart.Text = "Stop"
          
    Else
             
    Me.BackgroundWorker1.CancelAsync()
          
    End If
       
    End Sub

       
    ' The code that starts the asynchronous file search
       Private Sub BackgroundWorker1_DoWork(ByVal sender As ObjectByVal e As DoWorkEventArgs) _
          
    Handles BackgroundWorker1.DoWork
          
    ' Retrieve the argument.
          Dim path As String = e.Argument.ToString()
          
    ' Invoke the worker procedure.
          files = New List(Of String)
          SearchFiles(path)
          
    ' Return a result to the RunWorkerCompleted event.
          Dim msg As String = String.Format("Found {0} files", files.Count)
          e.Result 
    = msg
       
    End Sub

       
    Dim files As List(Of String)

       
    ' A recursive function that retrieves all the files in a directory tree.
       Sub SearchFiles(ByVal path As String)
          
    ' Display a message
          Dim msg As String = String.Format("Parsing directory {0}", path)
          
    ' Notice that we don't really use the percentage;
          ' instead, we pass the message in the UserState property.
          Me.BackgroundWorker1.ReportProgress(0, msg)

          
    ' Read the files in this folder and all subfolders.
          ' Exit immediately if the task has been canceled.
          For Each fi As String In Directory.GetFiles(path)
             
    If Me.BackgroundWorker1.CancellationPending Then Return
             files.Add(fi)
          
    Next
          
    For Each di As String In Directory.GetDirectories(path)
             
    If Me.BackgroundWorker1.CancellationPending Then Return
             SearchFiles(di)
          
    Next
       
    End Sub

       
    ' We need this variable to avoid nested calls to ProgressChanged.
       Dim callInProgress As Boolean

       
    Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As ObjectByVal e As ProgressChangedEventArgs) _
          
    Handles BackgroundWorker1.ProgressChanged
          
    ' Reject nested calls.
          If callInProgress Then Return
          callInProgress 
    = True
          
    ' Display the message, received in the UserState property.
          Me.lblMessage.Text = e.UserState.ToString()
          
    ' Display all files added since last call
          For i As Integer = lstFiles.Items.Count To files.Count - 1
             lstFiles.Items.Add(files(i))
          
    Next
          
    Me.Refresh()
          
    ' Let Windows process message in the queue. 
          ' If you omit this call, clicks on buttons are ignored.
          Application.DoEvents()
          callInProgress 
    = False
       
    End Sub

       
    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As ObjectByVal e As RunWorkerCompletedEventArgs) _
          
    Handles BackgroundWorker1.RunWorkerCompleted
          
    ' Display the last message and reset button's caption.
          Me.lblMessage.Text = e.Result.ToString()
          btnStart.Text 
    = "Start"
       
    End Sub


    End Class
  • 相关阅读:
    BUUOJ | [ACTF新生赛2020]usualCrypt (多重加密)
    高数笔记 | 快速索引 + 期末总结(2019-2020学年第二学期)
    BUUOJ | SimpleRev(字符对称加密)
    CTF OJ 题目分类 | Reverse
    CPPU程序设计训练营清明天梯模拟赛题解
    数据可视化 | 2020年3月世界疫情实存人数地图
    CTF OJ 题目分类 | PWN
    BJDCTF 2nd | Strenuous_Huffman(二进制模拟)
    ssh连接慢优化
    日常问题处理
  • 原文地址:https://www.cnblogs.com/callbin/p/1664766.html
Copyright © 2011-2022 走看看