【发布时间】:2010-02-24 16:38:52
【问题描述】:
我想使用AppDomain.CurrentDomain.GetAssemblies() 枚举Asp.NET 应用程序中所有加载的程序集。但是,在查看 AppDomain 的文档时,我发现以下语句:
线程安全
此类型的任何公共静态(在 Visual Basic 中为共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。
由于GetAssemblies() 是一个实例方法,我接受它是因为我必须对该调用进行某种锁定,如果不是为了其他任何东西,以防止其他人在我将新程序集加载到域中时m 枚举当前的。我希望 AppDomain 提供某种 SyncRoot 属性,但它没有,而且我没有在网上找到任何关于如何做的信息。
我应该如何同步这个调用?
编辑
- 我知道 lock 语句是用来创建合作锁的,这正是我想以与其他人一样(或应该做)的方式锁定 AppDomain 的原因,而不是创建自己的锁'在我枚举它们时,不要阻止不是我的代码加载程序集。
- 我知道任何人都可以使用的锁通常是个坏主意,但我也知道在执行不安全的操作时不使用锁会更糟糕。
- 到目前为止,两个答案都说 GetAssemblies() 实际上是线程安全的。这对我来说是有道理的,我真的希望会是这样,但你怎么知道呢?有没有人可以参考支持这一说法?我的 google-fu 让我失望了,Reflector 显示此方法是内部原生方法的薄包装。
【问题讨论】:
-
注意:
lock关键字不会“锁定对象”,因此其他代码无法使用它。相反,它保证任何其他尝试获取同一对象上的锁的代码都必须等到所有其他锁(当前和之前的锁)都被释放。换句话说,“除了我没有人使用这个”场景只有在对象只在锁块内使用时才是现实的。如果任何代码在没有获得锁的情况下使用它,这些语义就会失败。 -
我确切地知道 lock 关键字的作用,而且我也知道您几乎不应该锁定公共对象。
-
但是,我也知道竞态条件是最难调试的问题之一,所以我最想避免它们。
标签: .net synchronization appdomain