ウィンドウを作成し、SQLキューのエントリを監視するWindowsフォームアプリケーションがあります。何かが現れると、別のスレッドを起動する別のフォームを開くスレッドが生成され、ActiveXコントロールを含む作業を行います。コントロールが作業を終えたら、フォームから削除して処分し、ガベージコレクタを呼び出します。次に、デリゲートを使用してClose()
に電話します(スレッド内にあるため)。
ここで問題が始まります。私のデベロッパーボックスには、すべてが機能します。子フォームがなくなり、私が始めたメインフォームが残っています。ただし、Windows 2003 Serverボックスで実行しようとすると、動作しません。子供の形は消えない。それは凍る。私はそれを動かすことができますが、閉じようとすると「今すぐ終了」ダイアログが表示されます(メインフォームもフリーズし、ボタンをクリックすると「応答していません」と表示されます)。
私はChildForm_FormClosed
にログインしようとしましたが、イベントログのエントリを見ることができるので、閉じていると思っているときと実際に閉じたときの間にどこかに詰まっています...?Windowsフォームアプリケーションがプロダクション環境で子フォームを閉じないActiveXコントロール
この原因は何ですか?
私は、ActiveXコントロールがマシンに正しくインストールされていないかもしれないと思っていましたが、そのアプリケーションの一部が動作し、コントロールが既に破棄されるまでフリーズしません。
ウィンドウのスレッディング要件に違反すると、かなり標準的なデッドロックになります。誰かがあなたのためにこれをデバッグしたければ、ファイル共有サービスでこの動作を示す小さなreproプロジェクトを投稿する必要があります。 –