c# - IIS/WCF 静态方法线程安全

标签 c# wcf iis

在从 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 相关的内容中使用静态方法/类。

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

最佳答案

事实并非如此。

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

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

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

WCF 没有做这样的事情。你的同事现在需要提供一些证据来证明他的说法。这种无耻的说法往往源于该人令人困惑的经历。也许他通过将方法设为非静态并在没有意识到的情况下执行其他操作来修复错误。现在他相信静态属性是导致该错误的原因。这可能会导致迷信。

关于c# - IIS/WCF 静态方法线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29029708/

相关文章:

c# - 使用 XmlInclude 装饰的基类在序列化时仍会抛出类型未知异常是有原因的吗?

c# - Silverlight RichtextBox Xaml 属性,无法设置值(异常)

.net - 最小化 asp.net 的启动时间

web-services - 如何将 Web 服务从 Visual Studio 发布到 IIS?

.net - 带有 permessage-deflate 的 IIS 8 WebSockets

c# - 如何将 openssl_pkey_get_public 和 openssl_verify 转换为 C# .NET

C# TableAdapter 不插入和更新

php - 使用 PHP 调用具有多个绑定(bind)的 WCF Web 服务

wcf - 在(每个)Web API 操作之前执行代码

.net - 我可以确保 WCF 服务中 TCP 的互操作性吗?