ASP.NET应用程序中要小心使用放在App_Code文件夹类中的静态成员
来源:互联网 发布:配音秀软件下载 编辑:程序博客网 时间:2024/06/10 04:26
小心使用放在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());
}
情况会怎样?请感兴趣的朋友试一试,并思索一下出现这种现象的原因。
- ASP.NET应用程序中要小心使用放在App_Code文件夹类中的静态成员
- ASP.NET应用程序中要小心使用放在App_Code文件夹类中的静态成员
- 小心使用放在App_Code中类的静态成员
- Asp.net中Access数据库文件放在App_Code文件夹使Session奇怪失效的问题
- 关于Profile在App_Code文件夹中自定义类中的使用
- ASP.NET中使用App_Code文件夹的异常
- ASP.NET项目中,无法引用App_Code中的类
- VS2008在资源管理器中按右键添加ASP文件夹时没有App_Code选项,自行新增后放在里面的类文件不能调用!
- ASP.NET 网站中的共享代码文件夹 App_code 与 Bin
- 开发ASP.NET 2.0 Web应用程序时如何将App_Code文件夹中的共享代码配置生成多个Dll
- ASP.NET中App_Code,App_Data等文件夹的作用
- ASP.NET中Bin、App_Code、App_Data等文件夹的作用
- ASP.NET中App_Code,App_Data等文件夹的作用
- ASP.NET中bin app_code app_data等文件夹的作用
- asp.net中app_code和bin文件夹介绍
- ASP.NET中App_Code,App_Data等文件夹的作用
- ASP.NET中App_Code,App_Data等文件夹的作用
- ASP.NET中App_Code,App_Data等文件夹的作用
- 什么是水晶报表?
- 英文赞美句子,大家应该看看
- 我是世界上最低贱的程序员!
- 十进制转化成N进制
- 怎么样才能快速掌握java
- ASP.NET应用程序中要小心使用放在App_Code文件夹类中的静态成员
- 温馨话语1
- 十个杠杆撬起领导力
- 随机获取当前文件夹下面的Aspx文件名称
- 一个关于个人性格测试的东西
- SQL防注入过滤函数
- 如何被猎头"猎杀":猎头慕名而来的绝招
- Java中的异常处理
- MIME邮件面面观