`
izuoyan
  • 浏览: 8916493 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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());

}

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

分享到:
评论

相关推荐

    ASP.NET的网页代码模型及生命周期

    当页面被呈现之前,ASP.NET应用程序会解释并编译相应的cs文件中的代码,与此同时,ASP.NET应用程序还会将.aspx页面进行编译并生成.aspx页面对应的类。生成.aspx页面对应的类后会将该类与cs文件中的类进行协调生成新...

    asp.net知识库

    在ASP.NET中使用WINDOWS验证方式连接SQL SERVER数据库 改进ADO.Net数据库访问方式 ASP.NET 2.0 绑定高级技巧 简单实用的DataSet更新数据库的类+总结 [ADO.NET]由数据库触发器引发的问题 为ASP.NET封装的SQL数据库...

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    书中提供了大量的实例,可帮助读者快速掌握如何在.NET平台下开发功能强大的ASP.NET应用程序。本书适合有一些基础的ASP.NET初级程序员以及准备迁移到ASP.NET 2.0的编程老手。该书与《ASP.NET 2.0入门经典(第4版)》...

    零基础学ASP.NET 2.0电子书&源代码绝对完整版1

    App_Code\ Name.cs Name属性的自定义状态管理类。 第9章(\Chapter 09) 示例描述:本章学习母版页。 MasterPage.master 一个简单的母版页。 9-01.aspx 引用母版页。 MasterPage1.master 创建一个母版页...

    ASP.NET2.0高级编程(第4版)1/6

    3.7 ASP.NET应用程序文件夹66 3.7.1 \\App_Code文件夹66 3.7.2 \\App_Data文件夹70 3.7.3 \\App_Themes文件夹70 3.7.4 \\App_GlobalResources  文件夹71 3.7.5 \\App_LocalResources  文件夹74 3.7.6 \\App_Web...

    零基础学ASP.NET 2.0&源代码绝对完整版1

    App_Code\ Name.cs Name属性的自定义状态管理类。 第9章(\Chapter 09) 示例描述:本章学习母版页。 MasterPage.master 一个简单的母版页。 9-01.aspx 引用母版页。 MasterPage1.master 创建一个母版页。 9-...

    3.ASP.NET 2.0 入门经典(第4版) [压缩包1/10]

    ASP.NET 2.0在Web应用程序开发方面迈出了革命性的一步,新增了50多个服务器控件,类的数量也增加了一倍,其他许多方面也有很重大的变化。ASP.NET 2.0的目标是提高开发人员的效率、改善应用程序的性能和可伸缩性...

    在线订票系统源码(毕业设计_C#+SQL)_TicketWeb

    2. App_Code文件夹下是sql静态链接类System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection("server=(local);database=webSealTicket;uid=sa;pwd=;"); 如直接还原这里不用变化"server...

    网盘文件免费外链 v2.0.rar

    使用环境:IIS/ASP.NET/3.5 需要开启file目录可写权限 演示地址:pan.decadework.com 本程序特点易于扩展,伪静态解析格式可以自己修改,各个方面更改都蛮简单的,不会可以问我 ---文件说明: 文件位置:App_...

    .net开源的综合开发框架wojilu框架.zip

    极高的灵活性,除了网站频道,还可以在群组和个人空间中使用门户功能;和 SNS 无缝集成,所有评论都会第一时间将提醒发送给管理员;支持通用评论;支持在线采集和导入,使用简单;支持社会化分享。特别介绍:论坛...

Global site tag (gtag.js) - Google Analytics