AppDomain をアンロードしようとしていますが、CannotUnloadAppDomainException
.
MSDN は、この例外がスローされる可能性がある 3 つの理由について言及しています。
- アプリケーションの有効期間中にロードされたままにする必要がある、既定のアプリケーション ドメイン。
- 実行をすぐに停止できない実行中のスレッドを持つアプリケーション ドメイン。
- 既にアンロードされているアプリケーション ドメイン。
私のアプリケーションはケース 2) に苦しんでいます。
バックグラウンド スレッドがいくつかあります。たとえば、独自の Dispatcher を実行する検索インデックス作成スレッドがあります。
私が知る限り、私が電話するとき
AppDomain.Unload(subDomain);
次に、影響を受けるドメイン内のすべてのスレッドがThreadAbortException
.
理想的には、それはすべてのスレッドが「殺される」/停止することを意味しますよね?
次の 2 つの場合を除きます。
- スレッドがマネージド コードを呼び出すとき - 不運...
- スレッドが finally ステートメントで何らかのコードを実行するとき。
私のアプリケーションが最初に実行しているようです (おそらく、内部で管理されていないコードを呼び出しているため、停止しません)
大きな問題は、複数のスレッドがある場合に AppDomain をアンロードする方法です。
次の 2 つのオプションしか表示されません。
- スレッドを中止してから、どういうわけかスレッドの状態を再確認してください。それらが停止している場合は、呼び出すことができます
AppDomain.Unload
-例外はスローされません。 - もう 1 つの方法は、単純に call
AppDomain.Unload
です。おそらく例外がスローされます。その後、この例外をキャッチして、アンロードを再試行できます。AppDomain.Unload
影響を受けるすべてのスレッドを中止しようとするため、おそらく数回の再試行で十分です。
どちらのソリューションも、ハックと思われる再試行メカニズムを使用しています。
.NET でこれを行うための、より簡単で堅牢な方法はありませんか?