Kevin_
Kevin_

Reputation: 3106

VB.Net Threading and Saving Results

I'm working on the program for work, where the user is able to search AD for a asset tag of a certain computer. If it is found it will give them a list in a listbox. I have all of that working, but when they do the search the UI freezes. I'm new to VB and OO for that matter. I understand that it is freezing because the search is running on the same thread as the UI, but I cannot for the life of me get another thread to do the work. When I tried to do the search in another thread I can't update the listbox because its not on the same thread. Any help would be greatly appreciated.

Function that searches AD:

   Private Function searchAd()

    'clear the results from previous entries
    ' AdResultListBox.Items.Clear()

    Try
        Dim rootEntry As New DirectoryEntry("GC://mydomaininfo")
        Dim searcher As New DirectorySearcher(rootEntry)

        'selects the Computer Name property
        searcher.PropertiesToLoad.Add("cn")


        Dim compname As String = PropertyTagTextbox.Text
        'searches using wildcards
        compname = "*" + compname + "*"

        searcher.Filter = "(&(name=" + compname + ")(objectcategory=moreADinformation))"

        Dim results As SearchResultCollection
        results = searcher.FindAll()

        Dim result As SearchResult


        For Each result In results

            'this is the part i'm having trouble with
            Me.AdResultListBox.Items.Add(result.Properties("cn")(0)

        Next

    Catch ex As Exception

    End Try
End Function



Private Sub ADSearchButton_Click(sender As Object, e As RoutedEventArgs) Handles ADSearchButton.Click
    AdResultListBox.Items.Clear()

    'create the new thread for searching
    Dim SearchThread As New Thread(AddressOf searchAd)
    SearchThread.Start()
End Sub

Upvotes: 0

Views: 176

Answers (2)

Andrew Morton
Andrew Morton

Reputation: 25023

There happens to be an MSDN article "Using System.DirectoryServices to Search the Active Directory" which shows running it in another thread at http://msdn.microsoft.com/en-us/library/ms973834.aspx#dotnetadsearch_topic9.

Upvotes: 2

Kratz
Kratz

Reputation: 4340

This is how I typically do it. The Invoke function is part of the control and that passes a delegate to the UI thread so it can be processed in the correct thread.

Invoke(Sub
          Me.AdResultListBox.Items.Add(result.Properties("cn")(0)
    End Sub)

http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx

Upvotes: 1

Related Questions