我有一个WCF服务,我从多个客户端调用。我需要在全球范围内存储和管理一个值。在我的服务上,我有以下属性:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)]
在我的服务中,我有类似的东西:
private static int counter;
public void PrintCounter()
{
counter++;
StreamWriter sw = new StreamWriter(@"C:\outFile.txt", true);
sw.WriteLine("Counter: " + counter);
sw.Close();
}
由于我对WCF的了解有限,我认为我有一个Singleton服务,而且我的私有变量是静态的,所有对服务的调用都会使用相同的对象。
但是,当我查看我的日志输出时,我看到以下内容:
Counter: 1
Counter: 1
我期望看到的是:
Counter: 1
Counter: 2
我是否遗漏了一些东西让我按照我需要的方式工作?我是否需要将对象存储在某种缓存中?非常感谢任何帮助。
如果需要,我可以发布更多编码。
答案 0 :(得分:2)
因为它是单身人士服务,例如只有一个实例将存在,为什么不将它作为常规类成员变量?
由于ConcurrencyMode也设置为单一 - 您甚至不必担心对变量的并发访问。
另一方面 - 使用ConcurrencyMode = Single的单例是一个真正非常慢的服务的配方,可能会很快成为瓶颈 - 所以你可能想要以一种在ConcurrencyMode = Multiple下工作的方式编写代码可能并发访问成员变量。
答案 1 :(得分:0)
我假设您只有一台服务器,因此这不是由于负载平衡。
静态数据应该保留,除非IIS因某种原因回收应用程序?
顺便说一句,你应该真的使用Interlocked.Increment
,但是这不应该导致你看到的问题(除非你在大量加载下,你看到像< / p>
10003120
10003121
10003121
10003121
10003122