修改线程中的类属性会导致接口转换错误(来自HRESULT的异常:0x80004002(E_NOINTERFACE))

时间:2017-10-02 10:39:17

标签: c# multithreading winforms exception interface

尝试访问我的" 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);
                }
            }
        }
    }

0 个答案:

没有答案