下面是构建缓存的代码,该缓存存储在当前应用程序域中加载的程序集中找到的(typeName,type)。
当尝试从一个特定的程序集(例如AssemblyK)加载类型时,我面临着这个奇怪的问题。 assemblyK具有大约954种类型。日志是同步的,在本地托管在Visual Studio中时,它运行良好。另外,当我在IIS中部署网站时,在第一次调用buildCache时,效果很好。
但是,当重新启动应用程序池/稍后调用它之后,它仅对5种类型运行嵌套循环,然后继续执行下一个功能,即它不会引发任何异常并向前移动。
private static void BuildCache()
{
Assembly[] assemblies= AppDomain.CurrentDomain.Getassemblies();
foreach(Assembly assembly in assemblies){
if(assembly.GlobalAssemblyCache){
if(assemblly.ToString().Contains("assemblyK"))
Logger.Log("GAC");
continue;
}
try
{
if(assembly.ToString().Contains("AssemblyK"))
{
string allTypes = string.Join(",",assembly.GetTypes().Select(x => x.ToString()).ToArray())
Logger.Log("All types :{0}",allTypes);
}
foreach(Type type in assembly.GetTypes())
{
if(assembly.ToString().Contains("AssemblyK"))
{
Logger.Log("Type parsed :{0}",type);
}
if(!typeCache.ContainsKey(type.FullName))
{
if(assembly.ToString().Contains("AssemblyK"))
{
Logger.Log("Adding to cache :{0}",type);
}
typeCache.Add(type.FullName,type);
}
}
catch(Exception ex)
{
Logger.Log("Exception Caught : {0}",ex.ToString());
}
}
}
值得注意的是,在Visual Studio 2008中以.Net 3.5版本构建的AssemblyK.dll运行良好,并且在Visual Studio 2019中进行编译时会导致此问题。应用程序池为2.0。并且assemblyK始终加载在“程序集”中。请帮忙。
P.S .:我将两种情况下(无论工作与否)收到的allTypes的日志复制到两个文件中,并使用cmd和fc file1 file2进行了文件比较。 两者都包含相同的数据,即954类型。所以我的问题是,foreach如何随机运行?这里可能是什么问题?
更新:日志显示为:
1)在可行的情况下: 所有类型:Type1,Type2,Type3,.. Type954
类型已解析954次
添加到缓存954次
2)在不工作的情况下: 所有类型:Type1,Type2,Type3,.. Type954。
键入Pased 4次。
typeCache是私有静态只读词典