gpt4 book ai didi

c# - IHostedService - StopAsync 与 Dispose

转载 作者:太空宇宙 更新时间:2023-11-03 14:38:00 29 4
gpt4 key购买 nike

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

现在我想知道,我应该在哪里注销这些处理程序?当然,我会在 Dispose() 中执行此操作。但是,StopAsync() 的作用是什么?

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

  1. StopAsync() 被调用
  2. Dispose() 被调用

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

如果我已经以某种方式注册,我是否应该处理这种情况,我的意思是检查 StartAsync()

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

最佳答案

Dispose 在您的对象准备好被垃圾收集器收集时调用(一般来说)。

它与托管服务没有太大关系,而是 .NET 中的通用接口(interface)。我不完全确定服务是否可以停止然后重新启动。 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 中注册您的处理程序,并在 StopAsync 中注销/清理。

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

关于c# - IHostedService - StopAsync 与 Dispose,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59301011/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com