c# - Queryable.Single 上的 IndexOutOfRangeException

标签 c# linq

我有一个 ASP.NET 站点,它已经完美运行了很长时间,最近没有任何变化。从一个小时到下一个小时,我开始在我执行 LINQ 查询的一行中收到 IndexOutOfRangeException:

var form = SqlDB.GetTable<ORMB.Form, CDB>()
    .Where(f => f.FormID == formID)
    .Single();

ORMB.Form 是一个 POCO 对象,具有 LINQ to SQL 属性将其映射到 MSSQL 表(映射已验证为正确)。堆栈跟踪如下:

System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at System.Collections.Generic.List`1.Add(T item)
   at System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user)
   at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
   at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression)
   at System.Linq.Queryable.Single[TSource](IQueryable`1 source)
   at GetForm.Page_Load(Object sender, EventArgs e)

反射 System.Collections.Generic.List.Add 显示以下代码:

public void Add(T item)
{
    if (this._size == this._items.Length)
    {
        this.EnsureCapacity(this._size + 1);
    }
    this._items[this._size++] = item;
    this._version++;
}

唯一容易出现 IndexOfOutRangeException 的行是 this._items[this._size++] = item,但是我看不出我是如何影响它的。

我可以通过应用程序域回收来解决问题,所以它一定与缓存有关。 ObjectTracking 在 DataContext 上关闭,以防万一。

我的直觉是,这可能是一个线程问题,SqlConnectionManager 在名为“用户”的列表字段中缓存了 IConnectionUser。如果两个线程同时进入 Add 方法,是什么阻止了以下情况的发生:

T1: Add(x)
T2: Add(y)
T1: Since _size == _items.Length: EnsureCapacity(_size + 1)
T2: Since _size > _items.Length: _items[_size++] = item;
T1: _items[size++] = item <- OutOfRangeException since T2 didn't increase the capacity as needed

有人吗?

最佳答案

您是否共享一个通用的 DataContext?这可以解释您所描述的线程问题,因为 DataContext 不是线程安全的。

关于c# - Queryable.Single 上的 IndexOutOfRangeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/208533/

相关文章:

c# - 停止正在运行的线程的安全方法是什么?

c# 如何获取资源文件夹中所有项目的文件路径

c# - 无法将源类型 'string' 转换为目标类型 'uint' c# 中的错误

c# - 枚举期间的 LINQ 转换

c# - 使用 2 个 from 子句重写 linq-to-sql 查询以连接

java - 从 C# 导出适用于 Java 的 X509EncodedKeySpec 的 RSA 公钥

c# - 强制在功能持续期间不绘画

c# - 我怎样才能改进 LINQ?

c# - 具有主机级别信任的 LINQ 反射

c# - 向 Entity Framework 添加自定义属性?