IHostedService - StopAsync 与 Dispose
IHostedService - StopAsync vs Dispose
我正在构建一个 IHostedService
实现。我的服务做了一些事情,应该在服务终止时处理,比如在 StartAsync()
.
中向外部服务注册一些事件处理程序
现在我想知道,我应该在哪里注销这些处理程序?我自然会在 Dispose()
内完成。然而,StopAsync()
是什么?
在控制台应用程序环境中,我认为它会像这样工作:
StopAsync()
被称为
Dispose()
被称为
我希望我的应用程序设计得很好,并且还涵盖其他可能的场景。例如,后台服务。我认为在这种情况下,可以选择 StopAsync()
,然后 StartAsync()
,中间没有 Dispose()
。我对吗?
我是否应该处理这种情况,我的意思是,如果我已经以某种方式注册,请登记 StartAsync()
?
很难找到一些关于 .NET Core 中带有控制台应用程序的通用主机的最佳实践。
Dispose
当您的对象准备好被垃圾收集器收集时调用(广义上讲)。
它与托管服务没有太大关系,而是 .NET 中的通用接口。我不完全确定服务是否可以停止然后重新启动。 docs 说下。
The hosted service is activated once at app startup and gracefully shut down at app shutdown. If an error is thrown during background task execution, Dispose should be called even if StopAsync isn't called.
因此我建议您在 StartAsync
和 deregister/cleanup 中注册您的处理程序 StopAsync
。
如果您有本机资源(例如文件句柄、管道、套接字),您应该在 Dispose
中清理它们。不要期望调用 StopAsync。您的主机可能无法正常关闭服务,但如果您的服务 "released" 可能会调用 Dispose,因此您仍然可以清理并成为一个好公民。
我正在构建一个 IHostedService
实现。我的服务做了一些事情,应该在服务终止时处理,比如在 StartAsync()
.
现在我想知道,我应该在哪里注销这些处理程序?我自然会在 Dispose()
内完成。然而,StopAsync()
是什么?
在控制台应用程序环境中,我认为它会像这样工作:
StopAsync()
被称为Dispose()
被称为
我希望我的应用程序设计得很好,并且还涵盖其他可能的场景。例如,后台服务。我认为在这种情况下,可以选择 StopAsync()
,然后 StartAsync()
,中间没有 Dispose()
。我对吗?
我是否应该处理这种情况,我的意思是,如果我已经以某种方式注册,请登记 StartAsync()
?
很难找到一些关于 .NET Core 中带有控制台应用程序的通用主机的最佳实践。
Dispose
当您的对象准备好被垃圾收集器收集时调用(广义上讲)。
它与托管服务没有太大关系,而是 .NET 中的通用接口。我不完全确定服务是否可以停止然后重新启动。 docs 说下。
The hosted service is activated once at app startup and gracefully shut down at app shutdown. If an error is thrown during background task execution, Dispose should be called even if StopAsync isn't called.
因此我建议您在 StartAsync
和 deregister/cleanup 中注册您的处理程序 StopAsync
。
如果您有本机资源(例如文件句柄、管道、套接字),您应该在 Dispose
中清理它们。不要期望调用 StopAsync。您的主机可能无法正常关闭服务,但如果您的服务 "released" 可能会调用 Dispose,因此您仍然可以清理并成为一个好公民。