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;
}

最近、値をテストするとすぐにコードがCOMExceptionをスローしていました ( SearchResultCollectionは null ではありません)。results.Count

Microsoft のドキュメントは、Countが何らかの種類の例外をスローする必要があることを示していません。

コードをデバッグするとき、上記の条件にブレーク ポイントを置き、マウスをその上に置くと、例外が存在することを確認できます。

例外のスクリーンショット

デバッガーに条件を表示F10させcatchたり、ブレークポイントで数秒間待機させたりすると、results.Count変数が有効になり、整数値が含まれます。

FindAllメソッドがスレッドで実行されており、スレッドが完了する前に結果を確認していると推測しています。

がいつ終了したか、またはActive Directoryの更新FindAll()の結果として発生したある種の新しいバグを発見したかを知る方法はありますか?

4

2 に答える 2

1

これはデバッガーのアーティファクトです。デバッグ式は、プロセス内のヘルパー スレッドで実行されます。コードが実行されているスレッドとは異なるスレッドであるという事実は、副作用をもたらす可能性があります。明らかなケースは、たとえば、ゲッターでロックを使用するプロパティです。

あまり目立たないものは、Active Directory などの COM 関連のものです。COM は、スレッド セーフではない COM サーバーに対してスレッド セーフを実装します。これはデバッガ スレッドではうまく機能しません。サーバーを作成したスレッドはフリーズしています。さらに、呼び出しをマーシャリングするためにプロキシ/スタブが必要ないなど、問題が発生する可能性があるものはすべてあります。

あなたには本当の問題はありません。

于 2012-04-28T09:15:15.827 に答える