我正在构建一个$this->load->library('email');
实现。我的服务做了几件事,当服务终止时应该处理,例如在IHostedService
中向外部服务注册一些事件处理程序。
现在我想知道,我应该在哪里实际注销这些处理程序?自然,我会在StartAsync()
中这样做。但是,Dispose()
是什么呢?
在控制台应用程序环境中,我认为它会像这样工作:
StopAsync()
被称为StopAsync()
被称为我希望我的应用程序设计合理,并能涵盖其他可能的情况。例如,后台服务。我认为在这种情况下,可以选择Dispose()
,然后选择StopAsync()
,而中间没有StartAsync()
。我对吗?
我的意思是我应该处理这种情况,以检查Dispose()
是否已经以某种方式注册了吗?
很难找到有关具有控制台应用程序的.NET Core中的通用主机的最佳实践。
答案 0 :(得分:1)
Dispose
在准备好由垃圾收集器收集您的对象时调用(广义上来说)。
它与托管服务无关,而是.NET中的通用接口。我不确定是否可以停止服务然后重新启动。 docs说以下话。
托管服务会在应用启动时一次被激活,并在应用关闭时正常关闭。如果在后台任务执行过程中抛出错误,即使未调用StopAsync,也应调用Dispose。
因此,我建议您在StartAsync
中注册处理程序,并在StopAsync
上注销/清除。
如果您具有本机资源(例如文件句柄,管道,套接字),则应在Dispose
中清理它们。不要期望StopAsync被调用。您的主机可能无法正常关闭服务,但是如果您的服务“发布”,很可能会调用Dispose,以便您仍然可以清理并成为好公民。