C# 在实体框架5中的DbProviderFactorys.IncludeFrameworkFactoryClasses()中的Type.GetType()期间冻结

C# 在实体框架5中的DbProviderFactorys.IncludeFrameworkFactoryClasses()中的Type.GetType()期间冻结,c#,asp.net,.net,entity-framework,C#,Asp.net,.net,Entity Framework,我的Entity Framework 5 ASP.NET MVC应用程序的本地执行今天突然停止工作。它启动后似乎思考了很长时间(我让它运行了2个小时)。每次我暂停它,无论是在30秒后还是30分钟后,它总是停留在dbProviderFactorys.IncludeFrameworkFactoryClasses()(在初始化过程中调用)中的同一位置。如果我反编译System.Data.dll的源代码,则该方法的相关部分如下所示: private static DataTable IncludeFra

我的Entity Framework 5 ASP.NET MVC应用程序的本地执行今天突然停止工作。它启动后似乎思考了很长时间(我让它运行了2个小时)。每次我暂停它,无论是在30秒后还是30分钟后,它总是停留在
dbProviderFactorys.IncludeFrameworkFactoryClasses()
(在初始化过程中调用)中的同一位置。如果我反编译
System.Data.dll
的源代码,则该方法的相关部分如下所示:

private static DataTable IncludeFrameworkFactoryClasses(DataTable configDataTable)
{
      DataTable providerDataTable = DbProviderFactoriesConfigurationHandler.CreateProviderDataTable();
      DbProviderFactoryConfigSection[] factoryConfigSectionArray = new DbProviderFactoryConfigSection[4]
      {
        new DbProviderFactoryConfigSection(typeof (OdbcFactory), "Odbc Data Provider", ".Net Framework Data Provider for Odbc"),
        new DbProviderFactoryConfigSection(typeof (OleDbFactory), "OleDb Data Provider", ".Net Framework Data Provider for OleDb"),
        new DbProviderFactoryConfigSection("OracleClient Data Provider", "System.Data.OracleClient", ".Net Framework Data Provider for Oracle", typeof (SqlClientFactory).AssemblyQualifiedName.ToString().Replace("System.Data.SqlClient.SqlClientFactory, System.Data,", "System.Data.OracleClient.OracleClientFactory, System.Data.OracleClient,")),
        new DbProviderFactoryConfigSection(typeof (SqlClientFactory), "SqlClient Data Provider", ".Net Framework Data Provider for SqlServer")
      };
      for (int index = 0; index < factoryConfigSectionArray.Length; ++index)
      {
        if (!factoryConfigSectionArray[index].IsNull())
        {
          bool flag = false;
          if (index == 2)
          {
            // FREEZES HERE:
            Type type = Type.GetType(factoryConfigSectionArray[index].AssemblyQualifiedName);
            if (type != (Type) null)
            {
              ...
            }
          }
          ...
        }
      }
      ...
   }
专用静态数据表IncludeFrameworkFactoryClasses(数据表configDataTable)
{
DataTable providerDataTable=DbProviderFactoriesConfigurationHandler.CreateProviderDataTable();
DbProviderFactoryConfigSection[]factoryConfigSectionArray=新的DbProviderFactoryConfigSection[4]
{
新的DbProviderFactoryConfigSection(typeof(OdbcFactory),“Odbc数据提供程序”,“Odbc的.Net Framework数据提供程序”),
新的DbProviderFactoryConfigSection(typeof(OleDbFactory),“OleDb数据提供程序”,“OleDb的.Net Framework数据提供程序”),
新的DbProviderFactoryConfigSection(“OracleClient数据提供程序”、“System.Data.OracleClient”、“Oracle的.Net Framework数据提供程序”、typeof(SqlClientFactory).AssemblyQualifiedName.ToString()。替换(“System.Data.SqlClient.SqlClientFactory,System.Data”,“System.Data.OracleClient.OracleClientFactory,System.Data.OracleClient”),
新的DbProviderFactoryConfigSection(typeof(SqlClientFactory)、“SqlClient数据提供程序”、“SqlServer的.Net Framework数据提供程序”)
};
对于(int index=0;index
它在调用Oracle提供程序的
Type.GetType()
时卡住
factoryConfigSectionArray[index].AssemblyQualifiedName
设置为“System.Data.OracleClient.OracleClientFactory,System.Data.OracleClient,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”
,它似乎是通过对
SqlClient
程序集执行某种奇怪的字符串替换而派生出来的

在任何情况下,我都不明白为什么在调用
Type.GetType()
时它会冻结,而不管实际提取的类型是什么。我以前从未见过这种行为,这很令人困惑。如果我深入研究调用堆栈,它实际上在
mscorlib
RuntimeTypeHandle.GetTypeByName()
中被冻结了,并且在问题所在的地方有一个托管到本机的调用

注意,我已经尝试重新启动VisualStudio,在调试和发布中清理和构建,并重新启动我的系统。无论发生什么,似乎都是在系统层面


以前有人见过这种情况吗(无论是实体框架还是其他)?有没有关于如何重新启动和运行的想法(尽管我显然也想了解问题的根源)?

解决了我的问题,所以我会发布它,以防有人有类似的想法。我遵照@vcsjones的建议,进行了几次内存转储,然后在WinDbg中对它们进行了分析。具体而言,我发现以下一系列命令非常有用:

.loadby sos clr
!clrstack
.symfix+
.reload
!clrstack
!dumpstack
!threads
!syncblk
!locks
!analyze -hang -v
此外,这篇博文非常有用:

最后,我将问题缩小到涉及两个线程的关键部分的死锁(最后的
!analyze-hang-v
命令帮助很大)。一个是我的主线程,另一个属于第三方日志库。这个问题最终与
Type.GetType()
dbProviderFactorys
或Oracle无关。这正是我的主线程在更原始的非托管操作上停止的地方。随后的内存转储只是显示它挂起在不同的位置,因为我注释掉了(我认为)导致上一次转储挂起的调用

更新日志库、确保清理整个构建文件夹(因此我没有动态加载旧的支持库)并重置IIS Express之后,我现在又开始工作了。

这是“获取内存转储并使用WinDbg/SOS查看”之类的问题之一。