我想使用AppDomain.CurrentDomain.GetAssemblies()
枚举Asp.NET应用程序中所有已加载的程序集。但是,在检查AppDomain的文档时,我发现以下语句:
线程安全
此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。
由于GetAssemblies()
是一个实例方法,所以我采取这种做法,因为我必须围绕该调用进行某种锁定,如果没有其他任何东西,那么为了防止其他人将新程序集加载到域中我列举了当前的那些。我希望AppDomain提供某种SyncRoot属性,但它没有,我没有在网上找到任何关于如何做的信息。
我该怎么同步这个电话?
修改
答案 0 :(得分:2)
一般来说,SyncRoot属性是一个非常糟糕的主意。一个原因是2个独立开发的库可能在不知不觉中决定锁定共享的SyncRoot属性并快速将死锁引入应用程序。锁定是一种无法在两个独立组件之间轻松可靠共享的操作。这里最好的策略是开发自己的锁,组件使用它来同步访问。
在这种情况下,尽管从多个线程调用GetAssemblies是安全的,因此不需要锁定。您看到的警告是添加到BCL中每个类的一般语句,除非作者专门为线程安全设计了类型并删除了消息。
答案 1 :(得分:1)
这是标准的免责声明;你不需要担心它 通常,只要您(或另一个线程)不修改对象,就可以从多个线程调用实例方法。