当前位置: 首页 > news >正文

ASP.NET应用程序中要小心使用放在App_Code文件夹类中的静态成员

小心使用放在App_Code中类的静态成员

每个ASP.NET应用程序都可以添加一个App_Code文件夹。放置在这一文件夹下的类可以被此ASP.NET应用程序中的所有页面所使用,可将这些类称为“全局类”,用起来很方便。

然而,如果这些类中定义了静态成员,则访问这些成员必须小心陷井。

请看以下示例:

public class SharedClass

{

public static int counter=0;

}

上述类放在App_Code中。网页访问代码如下:

protected void Page_Load(object sender, EventArgs e)

{

SharedClass.counter++;

Response.Write(SharedClass.counter.ToString());

}

上述代码好象没有什么问题,而且实验运行好象每次都正常。

然而,由于Web应用程序是多线程的,而App_Code中的类具有全局性,因此,上述代码会带来一个多线程数据存取冲突的问题。

我们可以修改SharedClass类来使这个问题突出出来:

private static int _counter = 0;

public static int Counter

{

get {

return SharedClass._counter;

}

set {

Thread.Sleep((new Random()).Next(5000, 10000));

SharedClass._counter = value;

}

}

上述代码通过随机延迟时间来以模拟互联网下的程序并发运行环境。

页面访问共享资源的代码不变。

现在请打开多个浏览器窗口,访问同一个页面(或多次刷新),注意访问间隔小于5秒,会发现多个页面得到相同的数字。事实上,这一数字并没有真实地反映出共享资源被访问的次数。

为了解决这个问题,可以将页面代码修改如下:

protected void Page_Load(object sender, EventArgs e)

{

lock (typeof(SharedClass))

{

SharedClass.Counter++;

Response.Write("共享资源被访问次数:" + SharedClass.Counter.ToString());

}

}

使用C#提供的lock关键字锁定资源现在,问题解决了。

另一个有趣的问题是,如果由共享资源本身实现存取控制,是否访问者就不需要再写存取控制代码了?

为此再次修改共享资源类:

public class SharedClass

{

private static int _counter = 0;

public static int Counter

{

get

{

lock (typeof(SharedClass))

{

return SharedClass._counter;

}

}

set

{

lock (typeof(SharedClass))

{

//随机睡眠一段时间(5~10秒)

Thread.Sleep((new Random()).Next(5000, 10000));

SharedClass._counter = value;

}

}

}

但维持原有的页面访问代码不变:

protected void Page_Load(object sender, EventArgs e)

{

SharedClass.counter++;

Response.Write(SharedClass.counter.ToString());

}

情况会怎样?请感兴趣的朋友试一试,并思索一下出现这种现象的原因。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • redis安装部署linux_redis在liunx环境下的安装和部署
  • python中最小公倍数_python怎么求最大公约数和最小公倍数
  • Windows Mobile开发资源介绍
  • csdn的登录验证做的太有“准”啦
  • al.99.vc挂马分析与解决建议
  • 手机html端 悬浮_移动端WEB开发 — 响应式布局
  • ransac算法_【干货】计算机科学中最重要的32个算法 你知道几个?
  • 超轻量级全文搜索框架的设计和实现 (1)
  • 免费的UML建模工具StarUml
  • 游戏设计与开发_上海游戏开发设计培训班制作属于自已的游戏
  • QReader阅读中文文本乱码的解决
  • python数据归一化代码_python 实现对数据集的归一化的方法
  • 《Solaris 红宝书》系列在线课程
  • FCIP基础
  • rs232接口引脚定义_电子设计 | 串口,UART,RS232之间的区别
  • CSS中外联样式表代表的含义
  • Django 博客开发教程 8 - 博客文章详情页
  • Docker 笔记(2):Dockerfile
  • Koa2 之文件上传下载
  • Vue组件定义
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 回流、重绘及其优化
  • 机器学习 vs. 深度学习
  • 聊聊hikari连接池的leakDetectionThreshold
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 王永庆:技术创新改变教育未来
  • 用mpvue开发微信小程序
  • 云大使推广中的常见热门问题
  • 运行时添加log4j2的appender
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • elasticsearch-head插件安装
  • 如何正确理解,内页权重高于首页?
  • #WEB前端(HTML属性)
  • (1)Jupyter Notebook 下载及安装
  • (2015)JS ES6 必知的十个 特性
  • (6)STL算法之转换
  • (7)svelte 教程: Props(属性)
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (Qt) 默认QtWidget应用包含什么?
  • (windows2012共享文件夹和防火墙设置
  • (八)Flink Join 连接
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (待修改)PyG安装步骤
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (转)大型网站的系统架构
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET 4.0中的泛型协变和反变
  • .net 7和core版 SignalR
  • .NET C# 使用 iText 生成PDF
  • .NET Core中如何集成RabbitMQ
  • .NET Micro Framework 4.2 beta 源码探析
  • .net 调用php,php 调用.net com组件 --
  • .NET 直连SAP HANA数据库