正如您在评论中提到的,您可以在客户端连接(或应用程序启动)时创建具有唯一GUID作为订阅名称的新订阅。并指定SubscriptionDescription.AutoDeleteOnIdle property来设置自动删除订阅后的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%删除订阅,您可以在外部存储保存有关客户端和subscriptionname(唯一的GUID)的信息,每次当一个客户端连接/重新连接时,可以检测一个记录存在于外部存储器中,表示此客户机尚未删除订阅(此客户机使用此订阅之前),如果该记录存在,则可以在创建新订阅之前删除该订阅。
''如果用户断开,相应的订阅应该自动删除.'''你能解释更多关于你的实际需求吗? “订阅者断开连接”是指用户(客户端用户)断开连接还是应用程序停止? –
我认为这两种情况。对于每个订阅,我只有一个客户端。客户可以断开manualy,stoped或粉碎。在所有情况下,我都希望将相应的订阅自动删除。可能在上面的链接中更清楚地解释它。可能的解决方案:为每个新客户端生成唯一的GUID作为订阅名称。如果客户端手动停止,我删除订阅manualy,如果它被击碎,我使用SubscriptionDescription.AutoDeleteOnIdle属性来自动删除。 – Tselofan