2015-03-13 53 views
2

在从IIS运行的WCF中,我有这段代码(以及类似的东西)。IIS/WCF静态方法Threadsafety

public static class Test 
{ 
    public static int Method(int x, int y) 
    { 
     int p = 10; 
     int r = p * x * y; 
     return r; 
    } 
} 

这个方法在理论上可以从100万个不同用户的100万个请求中同时调用。

我有一个论点与同事讨论,我的立场是,这个方法调用的每个实例是分开的,永远不会导致调用之间的数据损坏。这是由这个线程:C# : What if a static method is called from multiple threads?

然而,我的同事声称,IIS和WCF是一种特殊的怪物,可以缓存和启动/停止在各种奇怪的地方的电话,以便实际上这些电话实际上可以干扰另一个。

他举的例子是,如果一个调用在方法内部,另一个调用带有新的参数,那么int xint y参数变量值可能会被替换为已经进行的调用。

他的立场是从不在任何IIS/WCF相关的任何东西中使用static方法/类。

我还没有找到任何可以支持这两种情况的可靠文档,任何人都会在这个问题上抛出一些好的文档参数?

+0

可能他们将线程安全问题与单例是否将成为您网站使用的唯一实例的问题混淆。我认为他们在关于不在网站中使用单例模式的一般规则是正确的。即使其他一切正常,请考虑一个网络农场 – Ewan 2015-03-13 12:03:59

回答

3

事实并非如此。

.NET代码无法干扰其他代码的执行。例如,它不能缓存调用或停止它们,或者导致局部变量在不共享时共享。 CLI规范明确规定了静态方法的执行方式。

即使WCF框架的作者想要做这样的事情,他们也做不到。 (至少不是没有CLR运行时支持)

如果突然不再安全地调用静态方法(!)哪些代码仍然可以运行?!你甚至无法拨打string.Join

WCF没有这样的事情。现在你的同事需要提供一些他已经声称的证据。这种令人愤慨的说法通常是由该人所作的令人困惑的经历引起的。也许他通过使一个非静态的方法来修复一个bug,并在没有意识到的情况下做其他事情。现在他认为静态属性是导致错误的原因。这可能导致迷信的信仰。