我需要在 ASP.NET 核心 WebAPI 中调用 TopicClient.CloseAsync() 吗?

Do I need to call TopicClient.CloseAsync() in my ASP.NET Core WebAPI?

我正在使用包 Microsoft.Azure.ServiceBus。由于我应该重用 TopicClient 以充分利用 AMQP/SBMP,因此我将在我的一个单例服务中创建它一次。但是,TopicClient不是IDisposable,它只暴露了方法CloseAsync

我该怎么办?我什至需要在我的上下文中调用此方法吗?该文档对此并不十分清楚。

https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.servicebus.topicclient?view=azure-dotnet#methods

Closes the Client. Closes the connections opened by it.

这是我目前的草稿:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton(sp => new MyService());
...


public sealed class MyService: IDisposable
        public void Dispose()
        {
            _TopicClient.CloseAsync().GetAwaiter().GetResult();
        }

PS: 我只是在主题中留言,没有别的。

基本上规则是这样的:

如果你打开它,你应该关闭它。然而:

  • 如果实现了 IDisposable,这通常是隐式完成的
  • 一些 IDisposables 如果保持活动状态(HttpClient)工作得更好
  • 打开和关闭会花费大量时间
  • 这是关于生命周期范围的。

所以,

因为你有一个单例(应用程序生命周期范围),你应该保持打开状态,除非你遇到问题。

除此之外,一般来说,总线连接通常始终保持打开状态。

在应用程序退出时关闭它会很好,但这也不是强制性的。

旁注:您的 Singleton 中的主题客户端可能不是线程安全的。我会仔细检查一下。


那么你什么时候关闭这个总线连接?

在某些情况下,您可能希望显式调用关闭。

例如: - 您的连接不稳定(卫星或长波无线电)。在这种情况下,如果您不时发送,您可能想要打开、发送和关闭。 - 您的总连接数已达到最大值。 - 如果你以非常低的间隔发送一些东西(比如每小时一次,那么它只会节省一些资源) - 大量并发任务(如果客户端不是线程安全的)

还有很多,但这总是取决于用例。请记住,如果您 运行 遇到问题,可能是因为只使用了一个连接。