【问题标题】:Azure.Messaging.ServiceBus: should I remove ProcessMessageAsync handler from ServiceBusProcessor on disposing?Azure.Messaging.ServiceBus:我应该在处置时从 ServiceBusProcessor 中删除 ProcessMessageAsync 处理程序吗?
【发布时间】:2021-12-23 23:38:51
【问题描述】:

我正在使用Azure.Messaging.ServiceBus 库。

我创建ServiceBusClientServiceBusProcessor 来开始接收这样的队列消息:

var serviceBusClient = new ServiceBusClient(connectionString);
ServiceBusProcessor processor = serviceBusClient.CreateProcessor(queue);
processor.ProcessMessageAsync += HandleEvent;
processor.StartProcessingAsync();

在应用程序关闭时,我以这种方式处理 ServiceBusClientServiceBusProcessor

processor.ProcessMessageAsync -= HandleEvent; // Is this needed?
await processor.DisposeAsync();
await serviceBusClient.DisposeAsync();

我是否需要明确删除HandleEvent,或者processor.DisposeAsync() 应该对此负责?

我找不到processor.DisposeAsync() 正在删除其代码中的任何处理程序,但是,可能是因为根本不需要删除处理程序?官方文档似乎也缺乏任何关于如何正确处理 ServiceBusProcessor 实例的好例子。

难道await processor.DisposeAsync() 根本不需要,因为serviceBusClient.DisposeAsync() 应该完成所有工作?

【问题讨论】:

    标签: c# azure azureservicebus


    【解决方案1】:

    难道await processor.DisposeAsync() 根本不需要,因为serviceBusClient.DisposeAsync() 应该完成所有工作?

    是的,不需要await processor.DisposeAsync(),因为调用serviceBusClient.DisposeAsync()CloseAsync 应该完成所有工作,并确保网络资源和其他非托管对象得到正确清理。

    而且当ServiceBusClient 实例处置时,它会自动关闭并清理使用它创建的所有发送者、接收者和处理器

    【讨论】:

    • 感谢您的回答!你确定serviceBusClient.DisposeAsync() 会完成所有工作吗?可能我遗漏了一些东西,但从the code 我看到serviceBusClient.DisposeAsync() 没有处理任何处理器。而且似乎处理器也确实需要处理,因为ServiceBusProcessor 实现了IAsyncDisposable
    • 是的,你可以参考这个 MS 文档,其中提到了 -docs.microsoft.com/en-us/dotnet/api/overview/azure/…
    • 这意味着我也可以删除显式的processor.ProcessMessageAsync -= HandleEvent;,不是吗?
    • 是的!因为这个 [说]docs.microsoft.com/en-us/dotnet/api/overview/azure/… DisposeAsync() 将完成这项工作。
    猜你喜欢
    • 2012-12-11
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 2016-09-05
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多