1

AppDomain をアンロードしようとしていますが、CannotUnloadAppDomainException.

MSDN は、この例外がスローされる可能性がある 3 つの理由について言及しています。

  1. アプリケーションの有効期間中にロードされたままにする必要がある、既定のアプリケーション ドメイン。
  2. 実行をすぐに停止できない実行中のスレッドを持つアプリケーション ドメイン。
  3. 既にアンロードされているアプリケーション ドメイン。

私のアプリケーションはケース 2) に苦しんでいます。

バックグラウンド スレッドがいくつかあります。たとえば、独自の Dispatcher を実行する検索インデックス作成スレッドがあります。

私が知る限り、私が電話するとき

AppDomain.Unload(subDomain);

次に、影響を受けるドメイン内のすべてのスレッドがThreadAbortException.

理想的には、それはすべてのスレッドが「殺される」/停止することを意味しますよね?

次の 2 つの場合を除きます。

  • スレッドがマネージド コードを呼び出すとき - 不運...
  • スレッドが finally ステートメントで何らかのコードを実行するとき。

私のアプリケーションが最初に実行しているようです (おそらく、内部で管理されていないコードを呼び出しているため、停止しません)

大きな問題は、複数のスレッドがある場合に AppDomain をアンロードする方法です。

次の 2 つのオプションしか表示されません。

  • スレッドを中止してから、どういうわけかスレッドの状態を再確認してください。それらが停止している場合は、呼び出すことができますAppDomain.Unload-例外はスローされません。
  • もう 1 つの方法は、単純に callAppDomain.Unloadです。おそらく例外がスローされます。その後、この例外をキャッチして、アンロードを再試行できます。AppDomain.Unload影響を受けるすべてのスレッドを中止しようとするため、おそらく数回の再試行で十分です。

どちらのソリューションも、ハックと思われる再試行メカニズムを使用しています。

.NET でこれを行うための、より簡単で堅牢な方法はありませんか?

4

1 に答える 1