gpt4 book ai didi

.net - 可以锁定 (AppDomain.CurrentDomain)?

转载 作者:行者123 更新时间:2023-12-01 02:57:28 26 4
gpt4 key购买 nike

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

Thread Safety

Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.



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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com