C# webhost respawn上asp.net core自托管应用程序泄漏
我有一个自行托管的asp.net核心应用程序,需要偶尔用新的上下文更新其Web主机。应用程序在asp.net DI容器中将共享资源注册为单例C# webhost respawn上asp.net core自托管应用程序泄漏,c#,asp.net-core,memory-leaks,C#,Asp.net Core,Memory Leaks,我有一个自行托管的asp.net核心应用程序,需要偶尔用新的上下文更新其Web主机。应用程序在asp.net DI容器中将共享资源注册为单例 services.AddSingleton<MyDep>(); 我看到控制器的n个实例,其中n是对控制器的http请求数-控制器根本没有被处理。 探查器指示到根目录的长路径,该路径在链的末尾具有System.Threading.OverlappedData。你能告诉我这个设置有什么问题吗? 我看到控制器的n个实例,
services.AddSingleton<MyDep>();
我看到控制器的n个实例,其中n是对控制器的http请求数-控制器根本没有被处理。
探查器指示到根目录的长路径,该路径在链的末尾具有System.Threading.OverlappedData。你能告诉我这个设置有什么问题吗?
我看到控制器的n个实例,其中n是对控制器的http请求数
这是预期的行为。默认情况下,会为每个请求创建控制器
从中,我看不到有多个
MyDep
实例。快照显示了Func
的实例,它不是预期的单例。如果调用委托,您将在不同的请求中获得相同的MyDep
。总的来说,这里没有什么问题。您正在跟踪错误的类型。好的,我为所描述的问题显示了错误的跟踪。然而,上下文并没有得到适当的释放
我找到了一个解决方案:iaapplicationlifecycle.stopplication,如下所述->
上下文被正确释放,内存占用不再无限增长
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
public MyDep Dep { get; }
public ValuesController(MyDep dep)
{
Dep = dep;
}
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] {
new string(Dep.Content),
"value2" };
}
}
public static void Main(string[] args)
{
var p = new Program();
while (true)
{
p.Boot(args);
GC.Collect(2, GCCollectionMode.Forced, true);
}
}
private void Boot(string[] args)
{
webHost = CreateWebHostBuilder(args).Build();
webHost.RunAsync();
Thread.Sleep(5000);
webHost.StopAsync().Wait();
webHost.Dispose();
}