c# - 使用终结器关闭EventHubClient

标签 c# azure finalizer

我有一个类,它使用 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 等托管对象,请在包装器中实现 IDisposableIAsyncDisposable 并在 dispose 方法中关闭 EventHubClient。

如果调用者忘记处置 EventHubSender,那么您必须相信 EventHubClient 实现了自己的终结器,该终结器会关闭其拥有的所有非托管资源。如果没有,那么这是 EventHubClient 中的一个错误,该类需要修复它。

关于c# - 使用终结器关闭EventHubClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51208913/

相关文章:

c# - 复制 C# 对象和引用

c# - 如何退出所有正在运行的线程?

c# - Windows 8 中的透明度(Metro 应用程序)

Azure 数据工厂考虑 DST 转换时间戳

ubuntu - 无法在 Azure 托管的 neo4j 实例上编辑 neo4j.properties 文件

java - 如何使用 @concat 函数在 ARM 模板中转义单引号

c# - 析构函数和终结器的区别?

c# - 将通知模板从应用程序后端注册到 Azure 通知中心

Java终结器方法

java - 如何确定finalize()方法何时被调用