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 库。
我创建ServiceBusClient
和ServiceBusProcessor
来开始接收这样的队列消息:
var serviceBusClient = new ServiceBusClient(connectionString);
ServiceBusProcessor processor = serviceBusClient.CreateProcessor(queue);
processor.ProcessMessageAsync += HandleEvent;
processor.StartProcessingAsync();
在应用程序关闭时,我以这种方式处理 ServiceBusClient
和 ServiceBusProcessor
:
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 处理程序吗?的主要内容,如果未能解决你的问题,请参考以下文章