I have never used a background worker in vb.net, but from what I have read, I think it will help resolve an issue I am having during runtime. I am executing an sql statement, but it takes a bit to process. I think a background worker could help with this but I am unsure how to to implement this correctly. I greatly appreciate any help, tips, or comments. Thanks in advance!

 Private Sub DeparmentButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn3EData.Click, Btn3WData.Click, Btn4EData.Click, BtnCCUData.Click, BtnERData.Click, BtnAllData.Click, BtnMatData.Click
        'Declare variable
        Dim SelectedDeptButton As Button = CType(sender, Button)

        'Sends Department Information Needed to build SQL statement
    End Sub

#Region "SQLInformation"
    Public Sub FloorInfoNeeded(ByVal DepartmentNumber As String)
        'Declare variable
        Dim DepartmentsNeeded As String() = DepartmentNumber.Split("|")

        'Base SQL string statement
        StringNeeded = "SELECT [Patient Account Number], [PV1 Room], [PV1 Financial Class], [First Name] + ' ' + MI + ' ' + [Last Name] [Patient Name], [PV1 Attending Phy Lastname], SUBSTRING([PV1 Admit Date/Time], 5, 2) + '/' + SUBSTRING([PV1 Admit Date/Time], 7, 2) + '/' + SUBSTRING([PV1 Admit Date/Time], 1, 4) [Admit Date], SUBSTRING([PV1 Admit Date/Time], 9, 4) [Admit Time], [PV1 Admit Source], [PV1 Discharge Date/Time] FROM ADT WHERE (("

        'Adds the Departments Needed to the SQL statement
        Dim i As Integer = 0
        For Each dept As String In DepartmentsNeeded
            If i = 0 Then
                'First department
                StringNeeded = StringNeeded & "[PV1 Department] = '" & dept & "' "
                'Additional departments
                StringNeeded = StringNeeded & "OR [PV1 Department] = '" & dept & "' "
            End If
            i = i + 1

        'Ending section of SQL statement
        StringNeeded = StringNeeded & ") AND [PV1 Discharge Date/Time] = '') ORDER BY [PV1 Room]"

        'Determines what appears in the label based on the department
        If i = 1 Then
            Select Case DepartmentsNeeded(0)
                Case "030"
                    LblFloor.Text = "Three East"
                Case "032"
                    LblFloor.Text = "Three West"
                Case "028"
                    LblFloor.Text = "Four East"
                Case "042"
                    LblFloor.Text = "Critical Care"
                Case "060"
                    LblFloor.Text = "Emergency Department"
            End Select
        ElseIf i = 2 Then
            LblFloor.Text = "Maternity/Nursery"
            LblFloor.Text = "All Departments"
        End If

        'Run the built SQL string
    End Sub

    Private Sub RunSQL(ByVal SQLString As String)
        'Declare variables
        Dim myConnStr As String = My.Settings.CPSISQLConnectionString 'Connection string to Database
        Dim table As New DataTable 'Storage for holding data

        'Open and read
        Using con As New SqlConnection(myConnStr)

            Dim cmd As New SqlCommand(SQLString, con)
            Dim reader As SqlDataReader
            reader = cmd.ExecuteReader
            With DataGridView1
                .DataSource = table
            End With

            'Close all
        End Using
    End Sub
#End Region

    Private Sub bw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bw.DoWork
        'TODO:  Is this where RunSQL() should go?
    End Sub

    Private Sub bw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bw.ProgressChanged
        'TODO:  How does it determine if the progress has changed?
    End Sub

    Private Sub bw_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bw.RunWorkerCompleted
        'TODO:  How does it determine if the process is completed?
    End Sub

Is this where RunSQL() should go?


How does it determine if the progress has changed?

You use the BackgroundWorker.ReportProgress() method; that is, you explicitly update progress if you wish. You can get the instance of the BackgroundWorker by using the sender parameter. It is important to note that DoWork is run on a separate thread, but ProgressChanged and RunWorkerCompleted both run on the UI thread (which allows you to update controls and such).

How does it determine if the process is completed?

The work is completed when the DoWork delegate returns (i.e. bw_DoWork returns).

This article has been dead for over six months. Start a new discussion instead.