【问题标题】:IIS/WCF Static method ThreadsafetyIIS/WCF 静态方法 Threadsafety
【发布时间】:2015-03-13 10:17:48
【问题描述】:

在从 IIS 运行的 WCF 中,我有这段代码(类似的东西)。

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 方法/类。

我找不到任何支持这两种情况的可靠文档,有人愿意为此抛出一些很好的文档参数吗?

【问题讨论】:

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

标签: c# wcf iis


【解决方案1】:

事实并非如此。

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

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

如果突然调用静态方法(!)不再安全,那一段代码还能运行?!你甚至不能打电话给string.Join

WCF 不做这样的事情。您的同事现在需要为他所声称的提供一些证据。这种离谱的说法通常来自那个人的令人困惑的经历。也许他通过使方法非静态并在没有意识到的情况下做其他事情来修复错误。现在他认为静态属性是导致错误的原因。这可能会导致迷信。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2012-07-14
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2023-03-18
    相关资源
    最近更新 更多