Quindi, ecco la storia fino ad ora, ho questo lavoratore che usa un AppDomain per eseguire qualche compito. Il dominio è costoso da configurare e smantellare. Così ho creare una cache per-filo di oggetti WeakReference al lavoratore thingy in questo modo:AppDomain.Unload getta in Finalizer?
class Worker
{
[ThreadStatic]
static Dictionary<string, WeakReference> _workers;
public static Worker Fetch(...) { you get the idea }
private AppDomain _domain;
public Worker(...)
{
_domain = AppDomain.Create(...);
}
~Worker()
{
AppDomain.Unload(_domain);
}
// bla bla bla
}
Il problema che sto avendo è che sembra gettare sempre un'eccezione nella chiamata a AppDomain.Unload quando GC raccoglie:
System.CannotUnloadAppDomainException: Error while unloading appdomain. (Exception from HRESULT: 0x80131015)"
così sto pensando che sia strano, so che non ho niente 'disattivato' in quel dominio ... che cosa è l'affare? Un po 'di scavo e di tentativi ed errori sono arrivato fino a questo:
~Worker()
{
new Action<AppDomain>(AppDomain.Unload)
.BeginInvoke(_domain, null, null);
}
Quindi le mie domande sono:
- Will AppDomain.Unload sicuro sempre da un finalizzatore? Perché?
- Ho intenzione di sperimentare qualcosa di "indesiderabile" con la soluzione precedente?
Eventuali duplicati di [Perché AppDomain.Unload() errore nel finalizzatore?] (Https://stackoverflow.com/questions/1891480/why-does-appdomain-unload-error-in-finalizer) – Fabian