可以接受锁定(AppDomain.CurrentDomain)?

时间:2010-02-24 16:38:52

标签: .net synchronization appdomain

我想使用AppDomain.CurrentDomain.GetAssemblies()枚举Asp.NET应用程序中所有已加载的程序集。但是,在检查AppDomain的文档时,我发现以下语句:

  

线程安全

     

此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。

由于GetAssemblies()是一个实例方法,所以我采取这种做法,因为我必须围绕该调用进行某种锁定,如果没有其他任何东西,那么为了防止其他人将新程序集加载到域中我列举了当前的那些。我希望AppDomain提供某种SyncRoot属性,但它没有,我没有在网上找到任何关于如何做的信息。

我该怎么同步这个电话?

修改

  1. 我知道lock语句用于创建一个协作锁,这正是我想以其他人做(或应该做)的方式锁定AppDomain的原因,而不是创建我自己的锁在我枚举它们时,不要阻止我的代码加载程序集。
  2. 我知道任何人都可以使用锁定通常是个坏主意,但我也知道在执行不安全操作时不会锁定更糟糕。
  3. 到目前为止,两个答案都说GetAssemblies()实际上是线程安全的。这对我来说很有意义,我真的希望它是这样,但你怎么知道呢?有没有人提到支持这种说法?我的google-fu让我失望了,Reflector表明这个方法是一个围绕内部本机方法的瘦包装。

2 个答案:

答案 0 :(得分:2)

一般来说,SyncRoot属性是一个非常糟糕的主意。一个原因是2个独立开发的库可能在不知不觉中决定锁定共享的SyncRoot属性并快速将死锁引入应用程序。锁定是一种无法在两个独立组件之间轻松可靠共享的操作。这里最好的策略是开发自己的锁,组件使用它来同步访问。

在这种情况下,尽管从多个线程调用GetAssemblies是安全的,因此不需要锁定。您看到的警告是添加到BCL中每个类的一般语句,除非作者专门为线程安全设计了类型并删除了消息。

答案 1 :(得分:1)

这是标准的免责声明;你不需要担心它 通常,只要您(或另一个线程)不修改对象,就可以从多个线程调用实例方法。

请注意you should never lock on an AppDomain object