我有一个类,它使用 EventHubClient
(Microsoft.Azure.EventHubs
) 连接到 Azure EventHub。我在类上使用一个方法将事件发送到 EventHub,完成后,我想关闭与事件中心的连接。这是使用 Finalizer 的情况吗?
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.EventHubs;
public class EventHubSender
{
private readonly string hubName;
private readonly string connectionString;
private readonly EventHubClient eventHubClient;
public EventHubSender(string hubName, string connectionString)
{
this.hubName = hubName;
this.connectionString = connectionString;
// Create client
var connectionStringBuilder = new EventHubsConnectionStringBuilder(this.connectionString)
{
EntityPath = this.hubName
};
this.eventHubClient = EventHubClient.CreateFromConnectionString(connectionStringBuilder.ToString());
}
~EventHubSender()
{
// Close the client
this.eventHubClient.Close();
}
public async Task SendMessage(string value)
{
// Create the data
var eventData = new EventData(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)));
// Send message
await this.eventHubClient.SendAsync(eventData);
}
}
类 EventHubSender
可以为我想要发送数据的每个 EventHub 进行实例化,并且 SendMessage
方法可以被调用 n
次。我想关闭客户端实体,但不想依赖开发人员调用方法来关闭它。
如果我不确定 EventHubClient
位于何处,无论它是托管对象还是非托管对象,我认为问题的一部分。我读过this尝试获得理解,并查看了答案 here但我认为 Azure 的这个具体案例仍然值得质疑。
最佳答案
不,在终结器中关闭此对象是不安全的。 EventHubClient 可能会在 EventHubSender 之前完成。
要清理 EventHubClient 等托管对象,请在包装器中实现 IDisposable
或 IAsyncDisposable
并在 dispose 方法中关闭 EventHubClient。
如果调用者忘记处置 EventHubSender,那么您必须相信 EventHubClient 实现了自己的终结器,该终结器会关闭其拥有的所有非托管资源。如果没有,那么这是 EventHubClient 中的一个错误,该类需要修复它。
关于c# - 使用终结器关闭EventHubClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51208913/