C# 当似乎涉及线程或其原因时,如何解决集合修改错误?

C# 当似乎涉及线程或其原因时,如何解决集合修改错误?,c#,asp.net,collections,subsonic,subsonic3,C#,Asp.net,Collections,Subsonic,Subsonic3,此场景包括:ASP.NET、Visual Studio 2010、SQL Server 2008 R0和亚音速3.0.0.2 我已将此错误隔离到集合未被以任何明显方式修改的情况(没有添加/删除集合项,没有排序等)。所以,我的理解是这是某种线程问题,对吗 该错误发生在SubSonic.DataProviders.DbDataProvider中,在DbDataProvider.cs的FindTable方法中。我复制错误的方法基本上是从UI层快速连续多次调用此方法。这并不优雅,但这是迄今为止我所做的最

此场景包括:ASP.NET、Visual Studio 2010、SQL Server 2008 R0和亚音速3.0.0.2

我已将此错误隔离到集合未被以任何明显方式修改的情况(没有添加/删除集合项,没有排序等)。所以,我的理解是这是某种线程问题,对吗

该错误发生在SubSonic.DataProviders.DbDataProvider中,在DbDataProvider.csFindTable方法中。我复制错误的方法基本上是从UI层快速连续多次调用此方法。这并不优雅,但这是迄今为止我所做的最好的一次,因为在生产过程中,我的用户会间歇性地出现错误

以下是DbDataProvider.cs的完整源代码:

FindTable方法是发生错误的地方:

public ITable FindTable(string tableName)
{
    // The following line throws the error.
    var result = Schema.Tables.FirstOrDefault(x => x.Name.Equals(tableName, StringComparison.InvariantCultureIgnoreCase)) ?? 
                 Schema.Tables.FirstOrDefault(x => x.ClassName.Equals(tableName, StringComparison.InvariantCultureIgnoreCase));

    return result;
}  
以下是StackTrace:

at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
at System.Collections.Generic.List`1.Enumerator.MoveNext()
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
at SubSonic.DataProviders.DbDataProvider.FindTable(String tableName) in D:\TFS\SubSonic.Core\DataProviders\DbDataProvider.cs:line 345
at MyCorp.DataAccessLayer.SomeDb.FindTable(String tableName)
at SubSonic.Repository.SubSonicRepository`1.GetTable() in D:\TFS\SubSonic.Core\Repository\SubSonicRepository.cs:line 42
at MyCorp.DataAccessLayer.grid_type_obj.Init()
at MyCorp.DataAccessLayer.grid_type_obj..ctor()
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
有什么想法会导致这种情况,以及如何解决?我尝试引入一个锁,但这似乎带来了巨大的性能冲击


在我们先前使用亚音速2.2的版本中,一切都运行良好。迁移到亚音速3.x后,我们在开发、测试或UAT环境中没有发现任何问题。这只在我们投入生产后才成为一个问题。它似乎也与负载无关,因为我可以在本地应用程序开发环境中针对生产数据库复制错误,而无需其他活动的用户连接到数据库。

我不知道亚音速,但它可能有助于将Schema.Tables拉入强制执行的变量中(例如,Schema.Tables.ToArray())用于错误行的双重传递。

感谢您的想法。我确实尝试过,并注意到这样做会导致一些意外情况。我分配给Schema.Tables.ToArray()的数组变量to应该总是包含,比如说100个表。但是每当发生错误时,该数组变量将包含更少的表。因此,我不确定这是否指向一个单独的或相关的问题。