设为首页
加入收藏
站内地图
旧版入口
当前位置:首页 > 站长学院 > 网络编程 > ASP.NET

线程同步问题:static成员与ASP.NET中的Application对象

作者:佚名 出处:网络转载 时间:05-28 点击:

内容载入中...
支持原创支持教程中国 吴龙杰

“由于Aplication,static member是全局变量,而我们是在多线程服务器环境写程序,对他们的使用需要注意线程安全的问题”,这一点我完全同意,对于线程同步的问题,再补充一下:

如果在页面中有对 static 变量的写入操作,应该在代码中进行 Lock ,或者使用原子操作 Interlocked 类。

假如有Application["A"]、Application["B"]、Application["C"],有线程访问Application["A"]其他线程不能访问Application["B"] and Application["C"]。
我对这一点表示怀疑,读取操作应该不会导致 Lock,只有在进行写入的时候才会 Lock。
这一点在 HttpApplicationState 类(Application 对象是 HttpApplicationState 类的一个实例)内部是使用一个 ReadWriteObjectLock 对象来操作的,在读取进行时计数加 1,读取完成时计数减 1,写入是排他的,要等到计数为零才能开始写入,写入过程中会将计数置为 -1,防止其他线程进入读取。

如果使用 Application 对象,仅在 Application 集合中的两个或多个对象之间关系密切的时候,才需要使用 Lock(Application) 或者 Application.Lock() ,其他情况下几乎不需要考虑线程同步的问题。

这样看来,对于一般的操作,Application 对象就足够了。static 成员则更有利于类的逻辑封装和重用。

举个 static 成员使用的例子:一个 WebForm 程序和一个 WinForm 程序,要用到同一份数据,同样需要用到缓存技术,可以使用 static 成员将逻辑封装为一个 class,这个 class 就可以同时用在 WebForm 和 WinForm 当中。

收藏本文:
】【打印页面】【推荐给朋友】【关闭窗口
<< 上一篇 :Literal String的特性

站长学院

推荐信息