У меня есть программа, которая выполняет интенсивную симуляцию памяти. Ниже я написал небольшое консольное приложение, которое воспроизводит мою проблему.
class Program {
static void Main(string[] args) {
var t = new Task(() => DoMemoryHog(20000000));
t.Start();
t.Wait();
t.Dispose();
t = null;
GC.Collect();
Console.WriteLine("Done");
Console.ReadLine();
}
static void DoMemoryHog(int n) {
ConcurrentBag<double> results = new ConcurrentBag<double>();
Parallel.For(0, n, (i) => {
results.Add(Math.Sqrt(i.GetHashCode()));
});
}
}
Когда я запускаю программу, я вижу увеличение объема используемой памяти в диспетчере задач Windows, но когда задача завершена (и отображается «Готово»), память не возвращается к исходному уровню, это происходит только когда я закрываю приложение.
Кто-нибудь знает, как освободить память, используемую параллельной задачей, в то время как основное приложение продолжает работать? Как вы можете видеть, я уже пытался избавиться от него, устанавливая его ссылку на null и запуская сборщик мусора вручную (что вам не следует делать, я знаю).