我正在开发工作程序,用户可以在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
答案 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)