【发布时间】:2018-01-23 02:46:45
【问题描述】:
我有以下属性:
private static Collection<Assembly> _loadedAssemblies = new Collection<Assembly>();
internal static ReadOnlyCollection<Assembly> LoadedAssemblies
{
get { return new ReadOnlyCollection<Assembly>(_loadedAssemblies); }
}
在另一个类中我循环通过LoadedAssemblies
foreach (Assembly assembly in ResourceLoader.LoadedAssemblies)
在遍历程序集时,底层集合 (_loadedAssemblies) 有时会发生变化,从而产生 System.InvalidOperationException。使LoadedAssemblies 安全的首选方法是什么?我无法重现该问题,所以我无法尝试。
可以吗?
internal static ReadOnlyCollection<Assembly> LoadedAssemblies
{
get { return new ReadOnlyCollection<Assembly>(_loadedAssemblies.ToList()); }
}
编辑
public static void Initialize()
{
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
AddAssembly(assembly);
}
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyLoad += OnAssemblyLoad;
}
private static void OnAssemblyLoad(object sender, AssemblyLoadEventArgs args)
{
AddAssembly(args.LoadedAssembly);
}
private static void AddAssembly(Assembly assembly)
{
AssemblyName assemblyName = new AssemblyName(assembly.FullName);
string moduleName = assemblyName.Name;
if (!_doesNotEndWith.Exists(x => moduleName.EndsWith(x, StringComparison.OrdinalIgnoreCase)) &&
_startsWith.Exists(x => moduleName.StartsWith(x, StringComparison.OrdinalIgnoreCase)))
{
if (!_loadedAssemblies.Contains(assembly))
{
_loadedAssemblies.Add(assembly);
}
}
}
【问题讨论】:
-
为什么有时会发生变化?那就是导致异常。您不能在 foreach 中修改集合。
-
@TimSchmelter 看起来底层集合已被修改,导致迭代时出现异常,如何解决?
-
枚举时不要修改,显示修改它的代码
-
这是一种选择,但我想我必须做一些影响很大的改变,还有其他选择吗?
-
编辑了问题