InvalidOperationException调用ResourceManager.GetString时

时间:2015-10-27 08:31:47

标签: c# asp.net .net asp.net-mvc asp.net-mvc-4

我的应用程序偶尔抛出异常:

  

异常类型:InvalidOperationException异常消息:   收集被修改;枚举操作可能无法执行。

以及这里的stacktrace

    Exception type: InvalidOperationException 
    Exception message: Collection was modified; enumeration operation may not execute.
   at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalGetSatelliteAssembly(String name, CultureInfo culture, Version version, Boolean throwOnFileNotFound, StackCrawlMark& stackMark)
   at System.Resources.ManifestBasedResourceGroveler.GetSatelliteAssembly(CultureInfo lookForCulture, StackCrawlMark& stackMark)
   at System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet(CultureInfo culture, Dictionary`2 localResourceSets, Boolean tryParents, Boolean createIfNotExists, StackCrawlMark& stackMark)
   at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo requestedCulture, Boolean createIfNotExists, Boolean tryParents, StackCrawlMark& stackMark)
   at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents)
   at System.Resources.ResourceManager.GetString(String name, CultureInfo culture)

这是我的代码:

public IList<Function> MapWithLanguage(IList<Function> list)
{
    if (list == null)
    {
        return null;
    }
    var currentResource = Type.GetType("Fanex.Athena.Models.ViewModel.Menu, Fanex.Athena.Models");
    ResourceManager rm = new ResourceManager(currentResource);
    var newList = new List<Function>();
    foreach (var func in list)
    {
        newList.Add(new Function
        {
            Name = rm.GetString("Menu_" + func.FunctionId),
        });
    }
    return newList;
}

任何人都可以提供帮助吗?它太奇怪了!

2 个答案:

答案 0 :(得分:4)

经过长时间的检查,我找到了根本原因。 这是我的代码导致上述问题:

AppDomain.CurrentDomain.GetAssemblies().

因为此方法尝试加载生成的程序集,例如&#34; web_adg_gfgt_dfd.dll&#34;当IIS回收时,它们可以被删除。为了解决这个问题,我们只需要避免加载&#34;生成的程序集&#34;。

因此我们有两种方法可以解决:

1.Filter&#34;生成组件&#34;:

AppDomain.CurrentDomain.GetAssemblies().Where(i => i.IsDynamic == false).ToList()

2.使用此方法:

BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToList()

答案 1 :(得分:-1)

实际上是InvalidOperationException异常消息:集合已被修改;枚举操作可能不执行意味着:

我们正在使用foreach循环遍历集合中的元素。

我认为这可以解决你的问题。

foreach (var func in list.ToList())
{
//Do your stuff
}