温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何构建ASP.NET线程安全集合

发布时间:2021-11-22 14:10:08 来源:亿速云 阅读:219 作者:小新 栏目:编程语言

这篇文章给大家分享的是有关如何构建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的线程安全队列:

static void Example1(ThreadSafeQueue queue) {      using (var locked = queue.Lock()) {          if (locked.Count > 0) {              var first = locked.Dequeue();           }      }  }

名为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线程安全集合”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI