我需要在 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
。
我该怎么办?我什至需要在我的上下文中调用此方法吗?该文档对此并不十分清楚。
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 中的主题客户端可能不是线程安全的。我会仔细检查一下。
那么你什么时候关闭这个总线连接?
在某些情况下,您可能希望显式调用关闭。
例如:
- 您的连接不稳定(卫星或长波无线电)。在这种情况下,如果您不时发送,您可能想要打开、发送和关闭。
- 您的总连接数已达到最大值。
- 如果你以非常低的间隔发送一些东西(比如每小时一次,那么它只会节省一些资源)
- 大量并发任务(如果客户端不是线程安全的)
还有很多,但这总是取决于用例。请记住,如果您 运行 遇到问题,可能是因为只使用了一个连接。
我正在使用包 Microsoft.Azure.ServiceBus。由于我应该重用 TopicClient
以充分利用 AMQP/SBMP,因此我将在我的一个单例服务中创建它一次。但是,TopicClient
不是IDisposable
,它只暴露了方法CloseAsync
。
我该怎么办?我什至需要在我的上下文中调用此方法吗?该文档对此并不十分清楚。
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 中的主题客户端可能不是线程安全的。我会仔细检查一下。
那么你什么时候关闭这个总线连接?
在某些情况下,您可能希望显式调用关闭。
例如: - 您的连接不稳定(卫星或长波无线电)。在这种情况下,如果您不时发送,您可能想要打开、发送和关闭。 - 您的总连接数已达到最大值。 - 如果你以非常低的间隔发送一些东西(比如每小时一次,那么它只会节省一些资源) - 大量并发任务(如果客户端不是线程安全的)
还有很多,但这总是取决于用例。请记住,如果您 运行 遇到问题,可能是因为只使用了一个连接。