背景工作者与一次性论据

时间:2013-10-24 13:00:15

标签: c# .net

我有一个后台工作者接收一次性对象作为参数。在使用块内调用RunWorkerAsync方法。

这是一个简化的代码示例

    private void SearchTest(string filter)
    {
        bgWorker.DoWork += bgWorker_DoWork;
        using (DirectoryEntry dirEntry = new DirectoryEntry())
        {
            using (var search = new DirectorySearcher(dirEntry))
            {
                search.SearchScope = SearchScope.Subtree;
                search.Filter = string.Format("(&(objectCategory=group)(cn={0}))", filter);
                bgWorker.RunWorkerAsync(search);
            }
        }
    }
    void bgWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        var searcher = (DirectorySearcher) e.Argument;
        var reportList = new List<String>();

        bgWorker.ReportProgress(0);

        SearchResultCollection results = searcher.FindAll();
        foreach (SearchResult result in results)
        {
            reportList.Add(result.Properties["cn"][0]);

            bgWorker.ReportProgress(1);
        }
        e.Result= reportList;

    }

此代码正常工作(即:参数未放置在使用块的末尾,后台工作者正在执行工作,而使用块结束时),但我无法确定如何使用块正在这种情况下工作。后台工作程序参数是否已克隆且无法正确处理,是否会在后台工作程序完成时调用Dispose方法?发生了什么事?

编辑:我删除了后台工作人员并在Daniel回答后处理了该对象并且它仍然有效...所以这真的是DirectorySearcher Dispose特殊性......:

    private void SearchTest(string filter)
    {
        bgWorker.DoWork += bgWorker_DoWork;
        using (DirectoryEntry dirEntry = new DirectoryEntry())
        {
            using (var search = new DirectorySearcher(dirEntry))
            {
                search.SearchScope = SearchScope.Subtree;
                search.Filter = string.Format("(&(objectCategory=group)(cn={0}))", filter);

                ////////////////////
                search.Dispose();
                ////////////////////

                var reportList = new List<String>();
                SearchResultCollection results = searcher.FindAll();//Still work with the disposed instance
                foreach (SearchResult result in results)
                {
                    reportList.Add(result.Properties["cn"][0]);
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:3)

该对象肯定会被放置在使用块的末尾,因此您的后台工作者正在使用已处理的实例。

我猜测它仍然有效的原因是DirectorySearcher只有Dispose方法,因为它派生自Component并且实际上没有使用它,即{{1}没有做任何事情,这个类的方法不关心是否已经调用Dispose。