我正在使用IIS在ASP.Net中创建一个Web API。但是,我一直静态地存储类成员,以便可以跨不同的类访问它们。这显然是一种不好的做法,我注意到每次对API的请求都由于未清除成员而返回相同的值。我如何清除成员的每个请求,同时又可以跨类访问成员?
答案 0 :(得分:0)
您几乎永远不应在Web应用程序中使用静态变量。即使您希望在请求之间共享变量,在许多情况下,对静态变量的访问也不是线程安全的,这可能导致内存损坏,错误的系统行为,甚至导致系统整体故障(如果您不走运)。
如果您有需要共享的变量,请改用application variable。如果需要公共缓存,请使用已建立的caching techniques之一。
关于您的具体问题
我如何清除成员的每个请求,同时又可以跨类访问成员?
我认为这是一个误会。如果每次都重置变量,则绝对没有理由重复使用该变量。我猜您认为在每个请求中分配新变量会降低性能;这是错误的。使用共享变量实际上效率较低,因为多个线程将遇到false sharing,并且在每个请求完成时都必须互相等待。如果您每次使用一个新的集,则每个线程都有其自己的沙箱可以使用,并且可以更快地完成请求。
相反,将变量本地存储或作为成员变量存储在请求结束时丢弃的对象中。如果您在请求中的所有模块上都需要某个公共位置,则可以使用HttpContext.Item
或one of its alternatives。