我正在处理一个项目,该项目使用静态全局DataContext(虽然不建议这样做,但在这一点上非常难以更改)。我目前需要通过并行化一些独立的函数来提高某些部分的性能。由于DataContext不是线程安全的,因此我不能在新创建的线程内使用它。因此,我在每个线程内创建了一个新的DataContext,并在线程结束时将其释放。
新的datacontext一切正常,但我的问题是,函数的一个输入是与Global DataContext关联的IQueryable。运行该方法将导致“已经有一个与该命令相关联的打开的DataReader必须首先关闭”的异常。
问题是,我如何能够使用新的数据上下文而不是更改后的上下文来运行IQueryable。
以下是线程的示例代码:
新的datacontext一切正常,但我的问题是,函数的一个输入是与Global DataContext关联的IQueryable。运行该方法将导致“已经有一个与该命令相关联的打开的DataReader必须首先关闭”的异常。
问题是,我如何能够使用新的数据上下文而不是更改后的上下文来运行IQueryable。
以下是线程的示例代码:
var myQueryable = Global.DataContext.Customers.Where(a => a.Age <12);
ParallelLoopResult threads = Parallel.ForEach(groups, group =>
{
DataContext ctx = new DataContext(Const.ConnectionString);
myFunction(myQueryable);
ctx.Dispose();
});
把 myQueryable 重写到线程中的选项非常困难,因为有大量的逻辑需要生成它。将其转换为列表然后传递也不是一个选项,因为查询返回数千个条目,会对性能产生负面影响。
非常感谢任何帮助。