尝试访问我的" searchResultCollection"在一个单独的线程中修改它之后的属性(我已尝试过后台工作者和线程)我收到以下异常。无论我使用BackgroundWorker e.Result属性还是直接设置classes属性,都会发生异常。
如果我在一个帖子中完成所有处理,一切都很好。
从我的主函数中删除[STAThread]可以解决问题,但是因为我使用Windows窗体不是这种不好的做法吗?
通过单独的线程更新Windows窗体属性的正确方法是什么?
例外:
System.InvalidCastException: 'Unable to cast COM object of type 'System.__ComObject' to interface type 'IDirectorySearch'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{109BA8EC-92F0-11D0-A790-00C04FD8D5A8}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).'
表格类:
public partial class ActiveDirectoryDiscovery : Form
{
private DirectorySearcher directorySearcher;
private SearchResultCollection searchResults;
private BackgroundWorker runSearchWorker;
public ActiveDirectoryDiscovery()
{
InitializeComponent();
}
private void button_Start_Click(object sender, EventArgs e)
{
runSearchWorker = new BackgroundWorker();
runSearchWorker.DoWork += RunSearchWorker_DoWork;
runSearchWorker.RunWorkerCompleted += RunSearchWorker_RunWorkerCompleted;
runSearchWorker.RunWorkerAsync();
}
private void RunSearchWorker_DoWork(object sender, DoWorkEventArgs e)
{
string filter = this.textBox_LDAPQuery.Text;
directorySearcher = new DirectorySearcher(filter);
this.searchResults = directorySearcher.FindAll();
}
private void RunSearchWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
foreach (SearchResult result in this.searchResults) {
if (!result.Properties["objectclass"].Contains("computer")) {
return;
}
else {
ListViewItem newItem = new ListViewItem((string)result.Properties["cn"][0]);
this.listView_SearchResults.Items.Add(newItem);
}
}
}
}