关于 c#:无法访问已处置的对象。对象名称:\\’tlsxyz\\’

Cannot access a disposed object. Object name: 'tlsxyz'

从 Azure 函数向 Azure 服务总线(标准)主题发送消息时遇到随机错误。

消息错误是:

Cannot access a disposed object. Object name: 'tls2576'., Stacktrace :
at Microsoft.Azure.ServiceBus.Core.MessageSender.OnSendAsync(IList1
messageList) at
Microsoft.Azure.ServiceBus.RetryPolicy.RunOperation(Func
1 operation,
TimeSpan operationTimeout) at
Microsoft.Azure.ServiceBus.RetryPolicy.RunOperation(Func1 operation,
TimeSpan operationTimeout) at
Microsoft.Azure.ServiceBus.Core.MessageSender.SendAsync(IList
1
messageList) at ServiceBusFunctions.MyTopic.Run(HttpRequest req,
ILogger log, ExecutionContext context) in myAzureFunction

有时错误中的对象名称是\\'tls2716\\'。

代码从包含 3 个函数的 Azure 函数实例运行。有 2 个冗余功能 APP 包含从应用程序网关循环调用的相同代码。向主题发送消息的客户端代码是:

1
2
3
4
5
6
7
8
9
10
11
var message = new Message(Encoding.UTF8.GetBytes(requestBody));

//Custom properties for topis routing
message.UserProperties.Add("P1", P1);
message.UserProperties.Add("P2", P2);
message.UserProperties.Add("P3", P3);


ITopicClient topicClient = new TopicClient(SBConnectionString, CCTopicName);
await topicClient.SendAsync(message);
await topicClient.CloseAsync();

感谢您的帮助


问题是在并发调用使用静态主题客户端时关闭它。修复方法是不要关闭 topicclient 以重用它,并在打开连接时最小化连接数和调整性能


这是由于在从内存中清除后访问已处置的对象所致。