Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在C#控制台应用程序中使用依赖注入时,内存利用率会持续增加?_C#_Design Patterns_Inversion Of Control_Simple Injector_Language Concepts - Fatal编程技术网

为什么在C#控制台应用程序中使用依赖注入时,内存利用率会持续增加?

为什么在C#控制台应用程序中使用依赖注入时,内存利用率会持续增加?,c#,design-patterns,inversion-of-control,simple-injector,language-concepts,C#,Design Patterns,Inversion Of Control,Simple Injector,Language Concepts,我可能知道我发布的问题的答案:我在整个应用程序中使用构造函数依赖注入,这是一个循环的C#console应用程序,每次请求后都不会退出 我怀疑所有包含的对象的生命时间本质上是无限的。当尝试在注册时调整生存时间时,它警告说,由于依赖关系,暂时对象无法在单例对象上实现(这激发了对内存利用率和这个问题的研究) 这是我的第一个地面控制台应用程序,一个bot,它登录到服务提供商并等待消息。我来自.NET Core Web API,它同样具有依赖性,但我认为这里的关键区别在于我所有的代码都是平台本身,它单独处

我可能知道我发布的问题的答案:我在整个应用程序中使用构造函数依赖注入,这是一个循环的C#console应用程序,每次请求后都不会退出

我怀疑所有包含的对象的生命时间本质上是无限的。当尝试在注册时调整生存时间时,它警告说,由于依赖关系,暂时对象无法在单例对象上实现(这激发了对内存利用率和这个问题的研究)

这是我的第一个地面控制台应用程序,一个bot,它登录到服务提供商并等待消息。我来自.NET Core Web API,它同样具有依赖性,但我认为这里的关键区别在于我所有的代码都是平台本身,它单独处理每个请求,然后杀死运行的线程

我离这里有多近?我是否必须将bot本身与侦听服务提供商的基本控制台应用程序分离,并尝试复制IIS/kestrel/MVC路由提供的平台来分离各个请求

编辑:最初,我想把这个问题更多地看作是一个设计原则、最佳实践或是寻求方向。人们要求可复制的代码,所以我们开始:

namespace课程
{
内部课程计划
{
私有静态只读容器;
静态程序()
{
容器=新容器();
}
私有静态void Main(字符串[]args)
{
var config=新配置(args);
Container.AddConfiguration(args);
AddLogging(config);
Container.Register(()=>new-TelegramBotClient(配置[“TelegrameToken”])
{
超时=时间跨度。从秒(30)
});
Container.Register();
Container.Register();
Container.Register();
Container.Register();
Container.Verify();
Container.GetInstance().Process();
容器?.Dispose();
}
}
}
Bot.cs

namespace课程
{
内部类Bot:IBot
{
私有只读ITelegramBotClient(U客户端);
专用只读ISignalHandler\u signalHandler;
私人住宅;
公共Bot(ITelegramBotClient客户端、IEventHandler处理程序、ISignalHandler信号处理程序)
{
_signalHandler=signalHandler;
_客户=客户;
_client.OnCallbackQuery+=handler.OnCallbackQuery;
_client.OnInlineQuery+=handler.OnInlineQuery;
_client.oninlineresultselected+=handler.oninlineresultselected;
_client.OnMessage+=handler.OnMessage;
_client.onmessageedid+=handler.onmessageedid;
_client.OnReceiveError+=(发送方,args)=>Log.Error(args.apirestexception.Message,args.apirestexception);
_client.OnReceiveGeneralError+=(发送方,args)=>Log.Error(args.Exception.Message,args.Exception);
_client.OnUpdate+=handler.OnUpdate;
}
公共程序()
{
_signalHandler.Set();
_client.StartReceiving();
日志信息(“应用程序运行”);
_signalHandler.Wait();
日志信息(“应用程序关闭”);
}
公共空间处置()
{
处置(真实);
总干事(本);
}
受保护的虚拟void Dispose(bool disposing)
{
如果(_)返回;
if(disposing)_client.StopReceiving();
_这是真的;
}
}
}
EventHandler.cs

namespace课程
{
内部类EventHandler:IEventHandler
{
public void OnCallbackQuery(对象?发送方,CallbackQueryEventArgs e)
{
Debug(“CallbackQueryEventArgs:{e}”,e);
}
InLineQuery上的公共无效(对象?发送方,InlineQueryEventArgs e)
{
Debug(“InlineQueryEventArgs:{e}”,e);
}
已选择InLinesUltSelected上的公共无效(对象?发件人,ChosenInLinesUltEventArgs e)
{
Debug(“ChosenInlineResultEventArgs:{e}”,e);
}
消息上的公共无效(对象?发件人,MessageEventArgs e)
{
Debug(“MessageEventArgs:{e}”,e);
}
消息编辑上的公共无效(对象?发件人,消息事件参数e)
{
Debug(“MessageEventArgs:{e}”,e);
}
public void OnReceiveError(对象?发送方,ReceiveErrorEventArgs e)
{
Log.Error(e.ApiRequestException,e.ApiRequestException.Message);
}
ReceiveGeneralError上的公共无效(对象?发送方,ReceiveGeneralErrorReventArgs e)
{
日志错误(e.Exception,e.Exception.Message);
}
public void OnUpdate(对象?发送方,UpdateEventArgs e)
{
Debug(“UpdateEventArgs:{e}”,e);
}
}
}
SignalHandler.cs

这与我的问题没有直接关系,但在第三方库侦听消息时,它使应用程序处于等待模式

namespace课程
{
内部类SignalHandler:ISignalHandler
{
私有只读ManualResetEvent _resetEvent=新的ManualResetEvent(假);
专用只读SetConsoleCtrlHandler?\u SetConsoleCtrlHandler;
公共信号处理器()
{
if(!nativellibrary.TryLoad(“Kernel32”,typeof(Library.Assembly,null,out-var-kernel))返回;
if(nativellibrary.TryGetExport(内核,“SetConsoleCtrlHandler”,out var intPtr))
_setConsoleCtrlHandler=(setConsoleCtrlHandler)封送。GetDelegateForFunctionPointer(intPtr,
// Container.GetInstance<IBot>() will now always return the same instance
Container.Register<IBot, Bot>(Lifestyle.Singleton);