【问题标题】: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)
- 打开和关闭花费大量时间
- 这是关于生命周期范围的。
所以,
由于您有一个单例(应用程序生命周期范围),除非遇到问题,否则您应该保持打开状态。
除此之外,一般来说,总线连接通常始终保持打开状态。
在应用程序退出时关闭它会很好,但即使这样也不是强制性的。
旁注:单例中的主题客户端可能不是线程安全的。我会仔细检查。
那么你什么时候关闭这个总线连接?
在某些情况下,您可能希望显式调用关闭。
例如:
- 您的连接不稳定(卫星或长波无线电)。在这种情况下,如果您不时发送,您可能想要打开、发送和关闭。
- 您的连接总数已达到最大值。
- 如果你以非常低的间隔发送一些东西(比如每小时一次,那么它只会节省一些资源)
- 大量并发任务(如果客户端不是线程安全的)
还有更多,但始终取决于用例。记住这是一件好事,如果您遇到问题,可能是因为只使用了一个连接。