小心使用放在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());
}
情况会怎样?请感兴趣的朋友试一试,并思索一下出现这种现象的原因。
分享到:
相关推荐
App_Code目录在ASP.NET中是一个特殊目录,用于存放自定义的代码类文件,这些文件在编译时会被自动包含到应用程序的DLL中。接下来,我们将深入探讨如何利用App_Code来生成静态过滤HTML代码并操作SQL。 首先,我们...
VB.NET(Visual Basic .NET)是.NET Framework支持的一种编程语言,虽然在ASP.NET开源程序中相对C#使用较少,但这个例子展示了VB.NET在ASP.NET开发中的应用。 在ASP.NET中,`App_Code`目录是一个特殊目录,用于放置...
在C# Web应用程序开发中,有时会遇到无法访问`app_code`目录下类的问题。`app_code`目录是ASP.NET框架提供的一种特殊目录,用于存放全局共享的代码文件,如自定义类、数据库连接字符串等。然而,并非所有类型的Web...
ASP.NET 是微软开发的一种Web应用程序框架,用于构建动态网站、Web应用和服务。在这个场景中,我们关注的是ASP.NET如何生成静态网页。静态网页是指不依赖服务器端脚本或数据库查询来呈现内容的网页,它们在用户请求...
`App_Code` 目录是ASP.NET用来存放全局类和辅助代码的地方,虽然在这个例子中没有具体提及这个目录下的文件,但在实际开发中,可能有与伪静态相关的类或接口存在,如URL重写类。 `伪静态的意义.doc` 文件很可能包含...
- `App_Code`:ASP.NET中的文件夹,用于存放编译时自动合并的类文件。 - `Uploads`:可能用于存储上传的文件。 - `App_Data`:用于存放应用程序数据,如SQL Server Compact Edition数据库文件。 - `_assets`:可能...
当页面被呈现之前,ASP.NET应用程序会解释并编译相应的cs文件中的代码,与此同时,ASP.NET应用程序还会将.aspx页面进行编译并生成.aspx页面对应的类。生成.aspx页面对应的类后会将该类与cs文件中的类进行协调生成新...
书中提供了大量的实例,可帮助读者快速掌握如何在.NET平台下开发功能强大的ASP.NET应用程序。本书适合有一些基础的ASP.NET初级程序员以及准备迁移到ASP.NET 2.0的编程老手。该书与《ASP.NET 2.0入门经典(第4版)》...
第二种选择是使用aspnet_compiler.exe工具预编译应用为二进制发布版本,这样只需要推送一组程序集、静态内容和配置文件到服务器。第三种选项同样是使用aspnet_compiler.exe,但创建的是可更新的二进制部署,.as*x...
当我们在app_Code文件夹下的类文件中想要获取当前的目录时,由于缺乏对`HttpContext`的直接访问权限,上述方法都无法直接使用。此时,我们可以采取以下策略: 1. **通过`HttpContext`获取**: - 通常情况下,在非...
### ASP.NET 反射集成详解 #### 一、反射简介 反射是.NET框架中的一个强大特性,它允许我们在运行时动态地操作程序集、类型、方法等。这为开发提供了极大的灵活性,尤其是在需要进行元编程或者扩展性需求较高的...
【基于ASP.NET的商场购物系统】是一个典型的电子商务应用程序,它利用了Microsoft的ASP.NET框架来构建,该框架是用于开发动态网站、Web应用程序和Web服务的强大工具。ASP.NET提供了丰富的功能,包括内置的安全性、...
【标签】中的“互联网”表明这是互联网相关的产品,而“asp.net源码”则明确指出了这个程序的核心技术是微软的ASP.NET框架,这是一个用于构建Web应用程序的强大力量,支持多种语言,如C#、VB.NET等,提供丰富的功能...
App_Code\ Name.cs Name属性的自定义状态管理类。 第9章(\Chapter 09) 示例描述:本章学习母版页。 MasterPage.master 一个简单的母版页。 9-01.aspx 引用母版页。 MasterPage1.master 创建一个母版页...
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的简单网上超市源代码"是一个以asp.net技术为核心的Web应用程序,用于实现一个在线购物系统的功能。这个项目适用于学习和理解Web开发中的基础概念以及asp.net框架的应用。 【描述】提到的"基于...
- **Your First ASP.NET Core Application on a Mac Using Visual Studio Code**:指导用户在 macOS 上使用 Visual Studio Code 创建第一个 ASP.NET Core 应用。 - **Building Your First Web API with ASP.NET Core...