WCF静态变量通过每次调用重置

时间:2010-03-11 16:37:52

标签: c# .net wcf static singleton

我有一个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

我是否遗漏了一些东西让我按照我需要的方式工作?我是否需要将对象存储在某种缓存中?非常感谢任何帮助。

如果需要,我可以发布更多编码。

2 个答案:

答案 0 :(得分:2)

因为它是单身人士服务,例如只有一个实例将存在,为什么不将它作为常规类成员变量?

由于ConcurrencyMode也设置为单一 - 您甚至不必担心对变量的并发访问。

另一方面 - 使用ConcurrencyMode = Single的单例是一个真正非常慢的服务的配方,可能会很快成为瓶颈 - 所以你可能想要以一种在ConcurrencyMode = Multiple下工作的方式编写代码可能并发访问成员变量。

答案 1 :(得分:0)

我假设您只有一台服务器,因此这不是由于负载平衡。

静态数据应该保留,除非IIS因某种原因回收应用程序?

顺便说一句,你应该真的使用Interlocked.Increment,但是这不应该导致你看到的问题(除非你在大量加载下,你看到像< / p>
10003120
10003121
10003121
10003121
10003122