VB.Net线程化和保存结果

时间:2013-07-03 17:51:19

标签: vb.net multithreading

我正在开发工作程序,用户可以在AD中搜索某台计算机的资产标签。如果找到它,它将在列表框中为它们提供一个列表。我已经完成了所有这些工作,但是当他们进行搜索时,UI会冻结。我是VB和OO的新手。我知道它是冻结的,因为搜索在与UI相同的线程上运行,但我不能为我的生活获得另一个线程来完成工作。当我尝试在另一个线程中进行搜索时,我无法更新列表框,因为它不在同一个线程上。任何帮助将不胜感激。

搜索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

2 个答案:

答案 0 :(得分:2)

恰好有一篇MSDN文章“使用System.DirectoryServices来搜索Active Directory”,该文章显示在http://msdn.microsoft.com/en-us/library/ms973834.aspx#dotnetadsearch_topic9的另一个线程中运行它。

答案 1 :(得分:1)

这就是我通常的做法。 Invoke函数是控件的一部分,它将委托传递给UI线程,因此可以在正确的线程中处理它。

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

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