добрый день.
Есть сервис, при вызове создается домен, загружаются из BD необходимые сборки (это было нужно из-за поддержки версий, т.е. в одном случае одна версия в другом другая). Домен сохраняется в некий пул вида
Dictionary<String, AppDomain> listDomain
,
пул инициализируется вот таким образом:
public void Init(int processQueueInterval = INTERVAL_UNLOAD_DOMAIN)
{
//if (string.IsNullOrEmpty(pathToLogFile))
if (listDomain != null)
return;
listDomain = new Dictionary<string, AppDomain>();
queue = new Queue<String>();
if (processQueueInterval > 0)
{
logQueueThread = new Thread(() =>
{
while (workExists)
{
Thread.Sleep(processQueueInterval);
// Выгрузка домена
ProcessQueue();
}
});
logQueueThread.IsBackground = true;
logQueueThread.Start();
}
}
При необходимости выгрузить домен, его имя бросается в очередь
Queue<String> queue
, где он должен выгрузиться
private void ProcessQueue()
{
bool runGC = queue.Count > 0;
while (queue.Count > 0)
{
String nameDomain = queue.Dequeue();
if (nameDomain != null)
{
RemoveDomain(nameDomain);
}
}
if ((runGC) && (listDomain.Count == 0))
GC.Collect(2);
}
Проблема с раходом памяти, т.к. в итоге все падает когда выело всю память. Т.е. код для выгрузки вызывается, но толку от этого ни какого. То-ли GC не успевает отработать, то ли он вообще не выгрузился.....
Есть какая идея - куда копать?