社区编辑申请
注册/登录
构建ASP.NET线程安全集合浅析
开发 后端
构建ASP.NET线程安全集合在实际开发中是十分重要的一部分,那么构建ASP.NET线程安全集合需要注意哪些方面呢?本文就向你介绍这方面的情况,希望对你了解构建ASP.NET线程安全集合有所帮助。

大部分ASP.NET线程安全的集合都有一些基础性的缺陷:虽然每个操作都是线程安全的,但是多个操作无法组合起来使用。这意味着一些基本的执行顺序,例如在弹出顶部元素之前检查栈内元素数量会出现潜在的危险。尽管已经有一些API设法将某些操作绑定起来(例如.NET 4的Coordination Data Structures),但是它们往往会引入丑陋的方法(如TryDequeue)。

.NET 1里的集合尝试了另一种方式,它们会对外暴露一个SyncRoot属性,而不是在内部进行锁定。虽然SyncRoot仍然是同步对象的默认机制,但是.NET 2已经抛弃了SyncRoot/Wrapper设计模式。

那么该如何创建一个可用的组合式API呢?Jared Parson认为集合不应该直接暴露出ASP.NET线程安全的API,所有的方法都应该属于一个临时的对象,而这个对象只有在您锁定集合的时候才被创建出来。这个临时对象是集合的“钥匙”,只有钥匙的持有者才能获取集合内容。

以下示例为Jared Parsons的线程安全队列:

  1. static void Example1(ThreadSafeQueue queue) {    
  2.   using (var locked = queue.Lock()) {       
  3.    if (locked.Count > 0) {         
  4.      var first = locked.Dequeue();       
  5.     }    
  6.   }  

名为locked的对象本身不是ASP.NET线程安全的,但是开发人员只有在using代码块中才能正确执行操作。在遵守了这一简单规则之后,开发块里的所有代码就是线程安全的。Jared解释道:

与大部分ASP.NET线程安全的设计一样,这些代码还是有被误用的可能:

1、在ILockedQueue销毁之后却继续使用它。这种做法应该被禁止,用户现有的知识一般足以避免这个问题。此外一些静态检查工具,例如FxCop,会把这种做法识别为一个错误。我们也可以使用一种更严厉的做法来阻止此类情况出现:添加一个disposed标记,并在每个方法中进行检查。

2、如果用户在跨越多个Lock语句的情况下保留某个值(例如Count),那么可能会对集合的状况出现错误的判断和假设。

3、如果用户没有正确销毁ILockedQueue,那么这个对象会被***锁定。幸运的是,对于实现了IDisposable的对象,FxCop同样会将这种做法识别为一个错误——尽管这不是一个万分稳妥的机制。

4、无法确定用户是否会长期持有ILockedQueue对象。虽然IDisposable一般包含着“短期”的意味,但是这并不能做出***的保证。

5、ILockedQueue并不是线程安全的。虽然一般情况下用户不会把IDisposable对象交给多个线程使用,但这也是必须考虑到的情况之一。

构建ASP.NET线程安全集合的相关信息就向你介绍到这里,希望对你有所帮助。

【编辑推荐】

  1. ASP.NET缓存概念及其应用浅析
  2. ASP.NET缓存分析和实践浅析
  3. ASP.NET数据库缓存浅析
  4. ASP.NET源码之自定义控件DateTimePicker
  5. ASP.NET文件下载函数使用浅析
责任编辑:仲衡 来源: 酷勤网
相关推荐

2009-07-31 17:53:39

ASP.NET线程安全

2009-07-28 17:02:10

ASP.NET运行环境

2009-07-24 14:03:02

IIS ASP.NET

2009-08-10 18:24:29

2009-07-27 17:58:10

2009-08-03 18:00:00

ASP.NET服务器控

2009-07-23 17:05:11

ASP.NET安全性

2009-08-03 13:38:18

ASP.NET编程模型

2009-07-20 15:57:42

ASP.NET安全架构

2009-08-05 15:50:13

ASP.NET优点

2009-07-21 14:32:51

ASP.NET进程模型

2009-08-03 13:12:34

ASP.NET编程模型

2009-07-28 15:28:35

ASP.NET AJA

2009-08-04 17:28:45

Apache支持ASP

2009-07-20 16:08:04

ASP.NET应用程序

2011-02-13 09:17:02

ASP.NET

2009-07-24 13:41:15

2009-08-03 11:21:47

ASP.NET编程模型

2009-08-05 11:16:26

ASP.NET配置文件

2009-07-28 15:30:34

ASP.NET多线程

同话题下的热门内容

太强了!Python 开发桌面小工具,让代码替我们干重复的工作!Python轻量级Web框架:Bottle库!Python居然被用来开发游戏了?盘点你想不到的Python开发场景用了那么久的Lombok,你知道它的原理么?实战 | 如何用 Python 自动化监控文件夹完成服务部署!Fury:一个基于JIT动态编译的高性能多语言原生序列化框架细思恐极,插上U盘就开始执行Python代码太全了!用Python操作MySQL的使用教程集锦!

编辑推荐

使用Kotlin做开发一个月后的感想面试官问你什么是消息队列?把这篇甩给他!五大自动化测试的Python框架图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)2018年最流行的十大编程语言,其中包括你用的语言吗?
我收藏的内容
点赞
收藏

51CTO技术栈公众号