IHostedService - StopAsync 与 Dispose

Lor*_*eno 7 .net c# console-application .net-core

我正在构建一个IHostedService实现。我的服务做了一些事情,这些事情应该在服务终止时处理,例如将一些事件处理程序注册到StartAsync().

现在我想知道,我应该在哪里真正注销这些处理程序?我自然会这样做Dispose()。然而,StopAsync()那是为了什么?

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

  1. StopAsync()叫做
  2. Dispose()叫做

我希望我的应用程序设计良好并涵盖其他可能的场景。例如,后台服务。我认为在这种情况下,有一个选择StopAsync(),然后StartAsync()没有Dispose()之间的选择。我对吗?

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

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

Mad*_*han 3

Dispose当您的对象准备好被垃圾收集器收集时调用(广义而言)。

它与托管服务没有太大关系,而是 .NET 中的通用接口。我不完全确定服务是否可以停止然后重新启动。文档了以下内容。

托管服务在应用程序启动时激活一次,并在应用程序关闭时正常关闭。如果在后台任务执行期间引发错误,即使未调用 StopAsync,也应调用 Dispose。

因此,我建议您在 中注册处理程序StartAsync并在 中取消注册/清理StopAsync

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