【问题标题】:Do I need to call TopicClient.CloseAsync() in my ASP.NET Core WebAPI?我需要在我的 ASP.NET Core WebAPI 中调用 TopicClient.CloseAsync() 吗?
【发布时间】:2019-12-02 05:43:45
【问题描述】:

我正在使用包 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

关闭客户端。关闭它打开的连接。

这是我目前的草稿:

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


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

PS:我只是在主题中添加消息,没有别的。

【问题讨论】:

    标签: c# azure asp.net-core-webapi azure-servicebus-topics


    【解决方案1】:

    基本上规则是这样的:

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

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

    所以,

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

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

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

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


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

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

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

    还有更多,但始终取决于用例。记住这是一件好事,如果您遇到问题,可能是因为只使用了一个连接。

    【讨论】:

      猜你喜欢
      • 2021-06-04
      • 2019-04-20
      • 2010-12-07
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 2015-06-15
      • 2015-07-12
      • 1970-01-01
      相关资源
      最近更新 更多