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



由于 GetAssemblies() 是一个实例方法,因此我采用它是因为我必须在该调用周围采取某种锁定,如果不是为了其他任何事情,以防止其他人在我枚举当前程序集时将新程序集加载到域中.我希望 AppDomain 提供某种 SyncRoot 属性,但它没有,而且我还没有在网上找到任何有关如何操作的信息。

我应该如何同步这个电话?

编辑

  • 我知道 lock 语句是用来创建协作锁的,这正是我想以与其他人一样(或应该做)的方式锁定 AppDomain 的原因,而不是创建我自己的不会的锁在我枚举它们时,防止不是我的代码加载程序集。
  • 我知道任何人都可以使用的锁通常是一个坏主意,但我也知道在执行不安全操作时不使用锁更糟糕。
  • 到目前为止,两个答案都说 GetAssemblies() 实际上是线程安全的。这对我来说很有意义,我真的希望情况如此,但你怎么知道的?有没有人有引用资料来支持这个说法?我的 google-fu 失败了,Reflector 表明此方法是对内部 native 方法的薄包装。
  • 最佳答案

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

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

    关于.net - 可以锁定 (AppDomain.CurrentDomain)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2327710/

    10-15 13:31