Visual Studioで生成されたRCWでラップされた従来のVFP(FoxPro)COMコントロールを適切に処分しようとしています。コントロールは、コントロールを適切に破棄できるように呼び出すDestroyメソッドを公開します。 COMインスタンスを破棄する要求があった場合、コントロールのメソッドがバックグラウンドスレッドで実行されている可能性が非常に高いです。 VFPはシングルスレッドアパートメントモデルなので、Destroyを呼び出すときはVFP実行スタックに追加するだけです。マルチスレッド環境でのCOMの処理
COMインスタンスがいくつかのリソースをクリーンアップできるようにするには、Destroyを呼び出すのが理想的です。私の懸念は、VFP COMコントロールをインスタンス化すると、コントロールがホストされているVFP言語ランタイムインスタンスが実際に起動され、そのインスタンスがロックされる(非応答)ことがあります。このCOMコンポーネントは、大規模なエンタープライズ規模の20年前のレガシーアプリケーションの機能を公開しています。このコントロールのメソッドを呼び出そうとしている.NETスレッドがエラーを投げずにブロックする状況が見られました(常にレガシーのバグVFPコード)。これは頻繁には起こりませんが、バックグラウンドスレッドでVFP COMインスタンスのメソッドを実行し、そのスレッドがブロックされているかどうかを定期的にチェックするインスタンスマネージャを作成するように促すだけで十分な場合があります。 COMインスタンスとスレッドを監視し、監視する新しいインスタンスを再起動します。
これは、バックグラウンドメソッドが実行されているスレッドを破棄する正しい方法ですか?
COMコントロールが正しく破棄されるようにDestroyメソッドを呼び出そうとすると、魅力的になりますか?
if (_vfpThread != null)
{
try
{
if (_vfpThread.IsAlive)
_vfpThread.Abort();
}
catch (ThreadAbortException)
{ }
finally
{
_vfpThread = null;
}
}
if (_vfpInstance != null)
{
Marshal.ReleaseComObject(_vfpInstance);
_vfpInstance = null;
}
上記のコードが、このVFPコンポーネントを管理するクラスのDisposeメソッド用であることは明らかではありませんでした。私は確かにVFPスレッドを正常にシャットダウンしようと試みることができますが、そうするには1分ほどかかることがあります。 VFPスレッドは、AutoResetEventを使用して、主スレッドにリソースを正常に解放したことを通知します。問題は、VFPスレッドをふるいにかけたときに何が起こるかです。 WaitOneが60秒後にタイムアウトした後、VFPスレッドをアボートします。これはコンポーネントの通常のシャットダウン/再起動には問題ありませんが、Disposeメソッドの場合は有効ではありません。廃棄するべきことは何ですか? – RMart
これは正しいアプローチです。 VFPプロセッサをDispose外でシャットダウンするようにコードを修正します。これは別の問題です。また、愚かなThreadAbortException処理を指摘してくれてありがとう。 – RMart