我有一个后台工作者接收一次性对象作为参数。在使用块内调用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]);
}
}
}
}
答案 0 :(得分:3)
该对象肯定会被放置在使用块的末尾,因此您的后台工作者正在使用已处理的实例。
我猜测它仍然有效的原因是DirectorySearcher
只有Dispose
方法,因为它派生自Component
并且实际上没有使用它,即{{1}没有做任何事情,这个类的方法不关心是否已经调用Dispose。