Azure.Messaging.ServiceBus:我应该在处置时从 ServiceBusProcessor 中删除 ProcessMessageAsync 处理程序吗?

Posted

技术标签:

【中文标题】Azure.Messaging.ServiceBus:我应该在处置时从 ServiceBusProcessor 中删除 ProcessMessageAsync 处理程序吗?【英文标题】:Azure.Messaging.ServiceBus: should I remove ProcessMessageAsync handler from ServiceBusProcessor on disposing? 【发布时间】: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() 应该完成所有工作?

【问题讨论】:

【参考方案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() 将完成这项工作。

以上是关于Azure.Messaging.ServiceBus:我应该在处置时从 ServiceBusProcessor 中删除 ProcessMessageAsync 处理程序吗?的主要内容,如果未能解决你的问题,请参考以下文章