2012-03-12 11 views
6

私たちは、第三者システムを初期化するために使用されるスレッドが、それを終了させるのに使用されるスレッドと同じでなければならない非常に扱いにくいinteropの問題を抱えています。これを行わないと、デッドロックが発生します。 IISでホストされているWCFサービスからinteropを実行しています。現在、このクリーンアップは処分で行われ、通常は非常にうまく機能します。残念ながら、重い負荷の下でIISは無礼なアンロードを行い、決して処理を呼び出すことはありません。シャットダウンロジックをクリティカルファイナライザに移行することはできますが、初期化スレッドにアクセスできなくなるため、これは役に立ちません。現時点では、AppDomainが壊れた状態にある可能性が高いことをCLRに通知しているようです。しかし、私はそれを(またはそれが可能であっても)行う方法がわかりません。これがクラスレベルでの契約の有用性であるかもしれないが、私はそれらを完全に理解していないことは認めている。CERを使用して、finalizeが呼び出されないことを保証できますか?

EDIT:これは、ファイナライザのスレッドアフィニティの問題と見なすこともできます。だれでも賢明な解決策があれば、私はすべて耳を傾けています:)

+0

扱っているコンポーネントがネイティブであるか、管理されていますか? – JaredPar

+0

ネイティブ。独自のメモリ管理などを備えたシステムへのC APIです。 – Jeff

答えて

1

可能であれば、そのネイティブ依存性に依存するコードをスタンドアロンWindowsサービスアプリケーションに分割してみてください。 WCF/IISでうまく動作しない場合は、闘争ではなく競合を避ける必要があります。

+0

はい、そうかもしれません。私はこれについて話しましたが、私はちょうどまだ控えています:) – Jeff

+0

また、私は言っておくべきです - これはCLRのアンロードはおそらく事実であるあなたの解決策、私は確信しています)。 – Jeff

+0

アプリケーションアンロードについて気分が悪いとお考えですか?これは、アプリケーションプールが定期的にリサイクルされ(設定の学習)、ASP.NETも再起動するため、意図的なものです。http://stackoverflow.com/questions/829392/how-to-discover-the-reason-of- asp-net-application-restart –

関連する問題