私は非常に奇妙な状況にあります、私は前にそのようなことを見たことがありません。
プログラムとの通信に、サードパーティアプリのCOMインターフェイスを使用しています。処理中のCOMサーバーです。動的型付けを使用して、ターゲットアプリケーションのオブジェクトモデルにアクセスします。
dynamic app = Activator.CreateInstance(Type.GetTypeFromProgID("SomeProgId"));
そのオブジェクトを使用して、アプリケーションapp
の他のオブジェクトを取得dynamic
します。そのようなオブジェクトの1つは非常に大きな配列を表し、その要素には多数のプロパティがあります。この配列のすべての要素をトラバースし、それらのすべてのプロパティを読み取ります。つまり、大きなループで上記のオブジェクトを解析します(数分実行)。
問題は次のとおりです。たとえば、10回に1回の試行で、そのようなプロパティの1つ(毎回異なる)を読み取るときにスレッドが「ハング」することがあります。
string someString = app.SomeArrayObject.Get(i).SomeStringProperty;
私はこれを行うためにバックグラウンドワーカーを使用しますが、それは上記の割り当てにかかっています。クイックノート:上記のステートメントは1行の簡略化であり、実際には一度に1レベルずつオブジェクトにアクセスするため(「各ステートメントに1つのドットのみ」)、実際にはSomeStringProperty
プロパティの読み取りにハングします。例外などをスローせず、無期限にハングします。The thread '<No Name>' (0x1240) has exited with code 0 (0x0).
その直前にデバッガーの出力ウィンドウにメッセージが投稿されていることに気づいたので、一部のスレッドが予期せず終了したと思います(例外は記録されていません!)。デバッグを中断すると、そのようなシナリオ(COMオブジェクト内)では使用が非常に制限されるため、呼び出しスタックは実際には役に立ちません。
なぜそれが起こるのか、そしてそれがどのように可能であるのか私にはわかりません。単純な文字列プロパティを読み取ると、永続的にハングします。あなたはなにか考えはありますか?..