2017-02-08 9 views
3

У меня есть служба Windows на .NET 4.6.2, где я регистрирую Eb6 DbContext как Transient с помощью .NET ServiceProvider (System.IServiceProvider). Служба начинает использовать около 30 Мб памяти, а через день достигает 1 ГБ.ServiceProvider не освобождает память для переходного контекста EF

Запуск профилировщика процесса приводит к тому, что сотни тысяч объектов DbContext ждут выхода, хотя я использую контекст после каждого использования.

Вот пример кода:

// registration 
var services = new ServiceCollection(); 
services.AddTransient(sp => new ServiceDbContext(connectionString)); 
var serviceProvider = services.BuildServiceProvider(); 

// use 
using (var ctx = serviceProvider.GetRequiredService<ServiceDbContext>()) { ... } 

Добавление AsNoTracking на запросы уменьшить использование памяти, но контексты до сих пор хранятся в памяти навсегда. По-видимому, для ServiceProvider не существует метода выпуска.

Вот пример дерева объектов, запустив службу на несколько минут, а затем пропустив его на несколько минут. 4838 - это количество раз, когда я создавал контекст. Обратите внимание, я вынужден GC после нескольких минут простоя, прежде чем принимать этот snaptshot:

enter image description here

Есть ли что-нибудь еще, что я должен сделать, чтобы освободить контекст, кроме утилизации его? Или это какое-то ограничение встроенного поставщика услуг?

+0

Какой поставщик услуг именно вы используете? Как обычно, некоторый пример кода поможет, показывая, как вы регистрируете, разрешаете и используете эти контексты. – Evk

+0

@Evk, я добавил дополнительную информацию. – Natan

+0

Мне все еще не ясно, что это за ServiceCollection. Я знаю только один из System.Web.Services, и я помню, что у ядра .net есть такой класс, но вы не используете .net-ядро, насколько я понимаю. – Evk

ответ