IHostedService-StopAsync与Dispose

时间:2019-12-12 09:05:37

标签: c# .net .net-core console-application

我正在构建一个$this->load->library('email');实现。我的服务做了几件事,当服务终止时应该处理,例如在IHostedService中向外部服务注册一些事件处理程序。

现在我想知道,我应该在哪里实际注销这些处理程序?自然,我会在StartAsync()中这样做。但是,Dispose()是什么呢?

在控制台应用程序环境中,我认为它会像这样工作:

  1. StopAsync()被称为
  2. StopAsync()被称为

我希望我的应用程序设计合理,并能涵盖其他可能的情况。例如,后台服务。我认为在这种情况下,可以选择Dispose(),然后选择StopAsync(),而中间没有StartAsync()。我对吗?

我的意思是我应该处理这种情况,以检查Dispose()是否已经以某种方式注册了吗?

很难找到有关具有控制台应用程序的.NET Core中的通用主机的最佳实践。

1 个答案:

答案 0 :(得分:1)

Dispose在准备好由垃圾收集器收集您的对象时调用(广义上来说)。

它与托管服务无关,而是.NET中的通用接口。我不确定是否可以停止服务然后重新启动。 docs说以下话。

  

托管服务会在应用启动时一次被激活,并在应用关闭时正常关闭。如果在后台任务执行过程中抛出错误,即使未调用StopAsync,也应调用Dispose。

因此,我建议您在StartAsync中注册处理程序,并在StopAsync上注销/清除。

如果您具有本机资源(例如文件句柄,管道,套接字),则应在Dispose中清理它们。不要期望StopAsync被调用。您的主机可能无法正常关闭服务,但是如果您的服务“发布”,很可能会调用Dispose,以便您仍然可以清理并成为好公民。