パラメータとして使い捨てオブジェクトを受け取るバックグラウンド ワーカーがあります。メソッドは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]);
}
}
}
}