3

パラメータとして使い捨てオブジェクトを受け取るバックグラウンド ワーカーがあります。メソッドはus RunWorkerAsync​​ing ブロック内で呼び出されます。

これは単純化されたコードサンプルです

    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;

    }

このコードは機能しています (つまり、引数が using ブロックの最後に配置されていません。バックグラウンド ワーカーは、using ブロックの最後がヒットしている間、作業を行っています) が、using ブロックがどのように機能しているかわかりません。その場合。バックグラウンド ワーカーの引数は複製され、適切に破棄されませんDisposeか? バックグラウンド ワーカーの完了時にメソッドが呼び出されますか? どうしたの?

編集: バックグラウンドワーカーを削除し、ダニエルの回答後にオブジェクトを破棄しましたが、まだ機能しています...したがって、これは本当に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]);
                }
            }
        }
    }
4

1 に答える 1

3

オブジェクトは確かに using ブロックの最後で破棄されているため、バックグラウンド ワーカーは破棄されたインスタンスを使用しています。

なぜそれがまだ機能するのかについての私の推測では、それは派生し、実際にはそれを使用しないためDirectorySearcher、メソッドしか持たないためです。つまり、何もせず、このクラスのメソッドは Dispose が呼び出されたかどうかを気にしません。か否か。DisposeComponentDispose

于 2013-10-24T13:10:00.207 に答える