c# - 在每次调用时如何在 C# 类中使用变量?
问题描述
我正在使用 IIS 在 ASP.Net 中创建 Web API。但是,我一直在静态存储类成员,以便可以跨不同的类访问它们。这显然是不好的做法,我注意到每次对 API 发出请求时,由于未清除成员而返回相同的值。我将如何清除每个请求的成员,同时还能够跨类访问它们?
解决方案
您几乎不应该在 Web 应用程序中使用静态变量。即使您想跨请求共享变量,在许多情况下对静态的访问也不是线程安全的,这可能会导致内存损坏、系统行为不正确,甚至整个系统故障(如果您不走运的话)。
如果您有需要共享的变量,请改用应用程序变量。如果您需要公共缓存,请使用已建立的缓存技术之一。
至于你的具体问题
我将如何清除每个请求的成员,同时还能够跨类访问它们?
我认为这里有一个误解。如果每次都重置变量,则绝对没有理由重复使用变量。我猜您认为为每个请求分配新变量会产生性能成本;这是错误的。使用共享变量实际上效率较低,因为多个线程将经历错误共享,并且在每个请求完成时必须相互等待。如果您每次都使用一个新集合,每个线程都有自己的沙箱可以工作,并且可以更快地完成请求。
相反,将变量存储在本地或作为成员变量存储在请求结束时丢弃的对象中。如果您需要跨请求中的所有模块的某个公共位置,您可以使用HttpContext.Item
或其替代方案之一。
推荐阅读
- web-services - 使用 prestashop 网络服务导入大量产品:未知错误
- ruby - Ruby:隐式块转换为 Proc
- javascript - 在 Javascript/Typescript monorepo 中使用未发布的包处理 Docker 图像
- onem2m - 在处理 Update_Of_Resource 通知时,如何获取正在更新的资源的 id 或 url?
- kubernetes - 从容器注册表中获取 Kubernetes 镜像
- javascript - 使用 Google 饼图中只有一个值的 getImageURI() 时无法获得 3D 效果
- groovy - Groovy 在创建 xlsx 文件时返回错误
- python-3.x - 在 Matplotlib 中 groupby 之后的 Python 并排箱线图
- ios - 从第一个 VC 预加载 WKWebView url
- r - R 中 MatchIt 的问题