.NETサービスプロバイダ(System.IServiceProvider
インターフェイス)を使用して、EF6 DbContextを一時的に登録する.NET 4.6.2上にWindowsサービスがあります。このサービスは約30MBのメモリを使い始め、1日後には1Gbに達します。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は、私が文脈をインスタンス化した回数です。このsnaptshotを取る前に、私は、数分後にアイドルGCを強制注:私はそれを配置する以外のコンテキストを解放するために行う必要があり、何が
ありますか?または、組み込みサービスプロバイダのこの制限はありますか?
正確にどのサービスプロバイダを使用していますか?いつものように、いくつかのコード例は、それらのコンテキストの登録、解決、使用方法を示すのに役立ちます。 – Evk
@エヴァーク、私はさらに情報を追加しました。 – Natan
そのServiceCollectionが何であるかはまだ分かりません。私はSystem.Web.Servicesからしか知りません.netコアにはこのようなクラスがありますが、私が理解しているように.netコアは使用していません。 – Evk