我在Windows 10 IIS 1511上配置了WAS服务。我创建了一个简单的测试应用程序,以便在我启动我的actuall项目之前对所有主要问题区域进行排序。我的服务配置了并发多个,实例配置为单一。我有一个并发字典来管理并发。我用2个不同的代理对象对服务进行了2次调用,以订阅我的观察者/主题。 subscribe方法将订阅者添加到字典中。在第二次代理调用之后,字典中只有一个项目,我期待着2.所以看来我的服务并没有将我的更改保存到字典中。但是,如果我使用Hello操作,它只增加一个计数器(值类型),那么第二次调用后计数为2。这是我的客户端控制台代码:
static void Main(string[] args)
{
string personErnie = "Ernie";
string personAlvin = "James";
//using (PersonTracker.PersonTrackerClient personTracker1 =
// new PersonTracker.PersonTrackerClient("PersonTrackerPipeEndPoint"))
//using (PersonTracker.PersonTrackerClient personTracker2 =
// new PersonTracker.PersonTrackerClient("PersonTrackerPipeEndPoint"))
using (PersonTracker.PersonTrackerClient personTracker1 =
new PersonTracker.PersonTrackerClient("PersonTrackerHTTPEndPoint"))
using (PersonTracker.PersonTrackerClient personTracker2 =
new PersonTracker.PersonTrackerClient("PersonTrackerHTTPEndPoint"))
{
string h1 = personTracker1.Hello(personErnie); //Output: Hello Ernie, Seems like you using the http protocol, count = 1
string h2 = personTracker1.Hello(personAlvin); //Output: Hello James, Seems like you using the http protocol, count = 2
PersonObserver personObserverErnie = new PersonObserver(personErnie);
object disposeObserverErnie = personTracker1.Subscribe(personObserverErnie); // Dictionary Count = 1
PersonObserver personObserverJames = new PersonObserver(personAlvin);
object disposeObserverJames = personTracker2.Subscribe(personObserverJames); // Dictionary Count = 1
}
}
这是我的服务类:
[ServiceBehavior(
ConcurrencyMode = ConcurrencyMode.Multiple,
InstanceContextMode =InstanceContextMode.Single)]
public class PersonTracker : IPersonTracker
{
public static ConcurrentDictionary<string, PersonObserver> observers = null;
int Counter;
public string Hello(string name)
{
string protocol = OperationContext.Current.Channel.LocalAddress.Uri.Scheme;
return string.Format("Hello {0}, Seems like you using the {1} protocol, count = {2}",name, protocol,Counter++);
}
public UnsibscribePerson Subscribe(PersonObserver observer)
{
if (observers == null)
{
observers = new ConcurrentDictionary<string, PersonObserver>();
}
if (!observers.ContainsKey(observer.Name))
{
observers.AddOrUpdate(observer.Name, observer, (key, oldValue) => { return new PersonObserver(oldValue.Name); });
}
return new UnsibscribePerson(observers, observer);
}
}
这是我的合约界面:
[ServiceContract(SessionMode = SessionMode.Required)]
public interface IPersonTracker
{
[OperationContract]
string Hello(string name);
[OperationContract]
UnsibscribePerson Subscribe(PersonObserver observer);
}
取消订阅类是一个扩展IDisposable的类,一旦我对远程处理(管道)进行了排序,客户端就会取消注册。
问题:为什么字典不能保留我添加的观察者,但对于计数器来说它确实...
更新:
因此,只需在我的Subscribe操作的返回类型中删除UnsibscribePerson对象,我就解决了我的问题,但是我需要返回此对象。这与我的UnsibscribePerson对象有关,这是我做的更改和我的UnsibscribePerson对象:
[ServiceContract]
public interface IPersonTracker
{
[OperationContract]
string Hello(string name);
[OperationContract(IsInitiating = true)]
void Subscribe(PersonObserver observer);
}
这是我的UnsibscribePerson对象:
[DataContract(IsReference = true)]
public class UnsibscribePerson : IDisposable
{
[DataMember(EmitDefaultValue = false)]
private PersonObserver observer;
[DataMember(EmitDefaultValue = false)]
private ConcurrentDictionary<string, PersonObserver> persons;
public UnsibscribePerson(ConcurrentDictionary<string, PersonObserver> persons, PersonObserver observer)
{
this.persons = persons;
this.observer = observer;
}
public void Dispose()
{
if (observer != null && persons.ContainsKey(observer.Name))
{
PersonObserver person = null;
persons.TryRemove(observer.Name, out person);
}
}
}
我还将返回类型更改为值类型(返回列表的计数),我得到了结果(计数为1和2)。这似乎仍然与引用类型和值类型有关?
答案 0 :(得分:0)
这很令人尴尬:)我调用了UnsibscribePerson类的我的dispose方法,它在添加后立即删除了我的订阅者....
所以我的解决方案是不实现IDisposbale接口