Vì vậy, đây là câu chuyện cho đến nay, tôi có thingy công nhân này sử dụng một AppDomain để thực hiện một số nhiệm vụ. Tên miền đắt tiền để thiết lập và rách. Vì vậy, tôi tạo ra một bộ nhớ cache cho mỗi chủ đề của các đối tượng WeakReference cho người lao động thingy như vậy:AppDomain.Unload ném trong 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
}
Vấn đề tôi đang gặp là dường như lúc nào cũng ném một ngoại lệ trong các cuộc gọi đến AppDomain.Unload khi GC thu thập:
System.CannotUnloadAppDomainException: Error while unloading appdomain. (Exception from HRESULT: 0x80131015)"
Vì vậy, tôi nghĩ điều đó thật kinh khủng, tôi biết tôi không có bất cứ điều gì 'đang chạy' trong tên miền đó ... Whats thỏa thuận? Một chút đào và thử và sai tôi đến với điều này:
~Worker()
{
new Action<AppDomain>(AppDomain.Unload)
.BeginInvoke(_domain, null, null);
}
Vì vậy, câu hỏi của tôi là:
- Will AppDomain.Unload luôn luôn thất bại từ một finalizer? Tại sao?
- Tôi có phải trải nghiệm bất cứ điều gì 'không mong muốn' với cách giải quyết ở trên không?
Có thể trùng lặp của [Tại sao lỗi AppDomain.Unload() trong finalizer?] (Https://stackoverflow.com/questions/1891480/why-does-appdomain-unload-error-in-finalizer) – Fabian