MetalKid007
У меня есть реальное решение, и я могу объяснить, почему!
It turns out that LocalReport here is using .NET Remoting to dynamically create a sub appdomain and run the report in order to avoid a leak internally somewhere. We then notice that, eventually, the report will release all the memory after 10 to 20 minutes. For people with a lot of PDFs being generated, this isn't going to work. However, the key here is that they are using .NET Remoting. One of the key parts to Remoting is something called "Leasing". Leasing means that it will keep that Marshal Object around for a while since Remoting is usually expensive to setup and its probably going to be used more than once. LocalReport RDLC is abusing this.
По умолчанию время аренды составляет... 10 минут! Кроме того, если что-то делает различные звонки в него, это добавляет еще 2 минуты к времени ожидания! Таким образом, это может быть случайным образом от 10 до 20 минут в зависимости от того, как выстраиваются звонки. К счастью, вы можете изменить время ожидания. К сожалению, вы можете установить это только один раз для каждого домена приложения... Таким образом, если вам нужно удаленное взаимодействие, отличное от генерации PDF, вам, вероятно, потребуется создать другую службу, запускающую его, чтобы вы могли изменить значения по умолчанию. Для этого все, что вам нужно сделать, это запустить эти 4 строки кода при запуске:
LifetimeServices.LeaseTime = TimeSpan.FromSeconds(5);
LifetimeServices.LeaseManagerPollTime = TimeSpan.FromSeconds(5);
LifetimeServices.RenewOnCallTime = TimeSpan.FromSeconds(1);
LifetimeServices.SponsorshipTimeout = TimeSpan.FromSeconds(5);
Вы увидите, что использование памяти начинает расти, а затем в течение нескольких секунд вы должны увидеть, что память начинает возвращаться вниз. Мне потребовалось несколько дней с помощью профилировщика памяти, чтобы действительно отследить это и понять, что происходит.
Надеюсь, это поможет!