正如您在评论中提到的,您可以在客户端连接(或应用程序启动)时创建具有唯一 GUID 作为订阅名称的新订阅。并指定SubscriptionDescription.AutoDeleteOnIdle 属性来设置 TimeSpan 空闲时间间隔,在此之后订阅会被自动删除。
var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
var subscriptionname = Guid.NewGuid().ToString();
if (!namespaceManager.SubscriptionExists(topicname, subscriptionname))
{
SqlFilter updatedMessagesFilter =
new SqlFilter("mypro = 'test'");
namespaceManager.CreateSubscription(new SubscriptionDescription(topicname, subscriptionname) { AutoDeleteOnIdle = TimeSpan.FromMinutes(5) },
updatedMessagesFilter);
}
当客户端断开连接时,您可以手动删除订阅。
if (namespaceManager.SubscriptionExists(topicname, subscriptionname))
{
namespaceManager.DeleteSubscription(topicname, subscriptionname);
}
注意:为保证 100% 删除订阅,您可以在外部存储中保留有关客户端和订阅名称(唯一 GUID)的信息,并且每次客户端连接/重新连接时,您可以检测外部存储中是否存在指示订阅的记录(此客户端之前使用的)对于当前客户端仍然没有被删除,如果记录存在,您可以在创建新订阅之前删除该订阅。