0

我有一些代码可以正常工作很长时间来让某人登录我的应用程序:

private Employee Authenticate(string userName, string password) {
  DirectorySearcher search = new DirectorySearcher(_rootDirectory);
  search.Filter = "(&(objectClass=user)(SAMAccountName=" + userName + "))";
  try {
    SearchResultCollection results = search.FindAll();
    if (0 < results.Count) {
      // the rest of my code
      // that returns an employee
      // if the password matches
    }
  } catch (Exception err) {
    MessageBox.Show(err.Message, "ActiveDir.cs ADWrapper::AuthenticateUser Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  }
  return null;
}

最近,一旦我测试值(SearchResultCollection不为空) ,代码就会抛出COMException 。results.Count

Microsoft 的文档没有表明Count应该抛出任何类型的异常。

在调试我的代码时,我可以将断点放在上面的条件上,将鼠标悬停在上面,然后查看异常是否存在。

异常截图

如果我使用F10让调试器将我带到catch条件或在断点处等待几秒钟,则该results.Count变量将变为有效并包含一个整数值。

我猜FindAll方法正在线程中执行,并且我正在线程完成之前检查结果。

有没有办法知道何时完成,或者我刚刚发现了由于Active Directory更新FindAll()而发生的某种新错误?

4

2 回答 2

1

这是一个调试器工件。调试表达式在进程内的辅助线程上执行。它与执行代码的线程不同,这一事实可能会产生副作用。例如,明显的情况是在其 getter中使用锁定的属性。

不太明显的是任何与 COM 相关的东西,比如 Active Directory。COM 为非线程安全的 COM 服务器实现线程安全。这在调试器线程上无法正常工作,创建服务器的线程被冻结。加上其他任何可能出错的东西,比如没有编组调用等所需的代理/存根。

你没有真正的问题。

于 2012-04-28T09:15:15.827 回答
0

我发现了作为 OP 的确切行为。我的问题是我的过滤器有一个错误 - 发生这种情况时,我没有得到 FindAll() 抛出的错误,但随后尝试访问 .Count 在调试器中给出了错误......几秒钟后 .Count 返回零。

于 2017-07-20T11:43:45.273 回答