在EF6中并行运行不同的存储过程

时间:2015-05-18 15:10:54

标签: c# entity-framework stored-procedures asynchronous entity-framework-6

我想要在Parallel中启动许多不同的存储过程,以提高我的MVC Web应用程序的性能。这些存储过程从多个源收集信息并返回不同的数据类型。为简单起见,假设我只有两个,返回不同的复杂数据类型:

  • ups_Proc1返回usp_Proc1
  • 的列表
  • usp_Proc2返回usp_Proc2的列表

依旧......

我可以做其中一个号码,但它会在一系列中解雇它们:

List<usp_Task1> taskOneResult = await db.usp_Task1(parms).AsQueryable()
                                                         .ToListAsync();
List<usp_Task2> taskTwoResult = await db.usp_Task2(parms).AsQueryable()
                                                         .ToListAsync();

我见过的解决方案使用await Task.WhenAll()并传递了一系列任务,但我的是具有不同返回类型的任务。那么在处理不同的复杂返回类型时,如何并行激发多个存储过程呢?

更新 - 2015年5月20日

最后得到了一个可行的解决方案,我相信它是并行处理所有任务的。我必须使用Task.Factory.StartNew()命令将每个函数创建为要传递到Task.WaitAll()的任务。

我将所有这些应用到一个新类中,该类包含List<>,用于我正在使用的每个存储过程返回类型,允许我处理我的所有业务逻辑。构造函数中的代码看起来有点像这样:

var task1 = Task.Factory.StartNew(() => CallStoredProc1(parms));
var task2 = Task.Factory.StartNew(() => CallStoredProc2(parms));

var taskList = new List<Task> { task1, task2 };

Task.WaitAll(taskList.ToArray());

CallStoredProc1()CallStoredProc2()是私有void方法,我在其中执行存储过程调用并处理数据转换。

非常感谢任何反馈!

2 个答案:

答案 0 :(得分:1)

想我会将我的更新重新发布为解决方案。

最后得到了一个可行的解决方案,我相信它是并行处理所有任务的。我必须使用Task.Factory.StartNew()命令将每个函数创建为要传递到Task.WaitAll()的任务。

我将所有这些应用到一个新类中,该类包含List<>,用于每个存储过程返回类型我正在使用,允许我处理我在那里的所有业务逻辑。构造函数中的代码看起来有点像这样:

var task1 = Task.Factory.StartNew(() => CallStoredProc1(parms));
var task2 = Task.Factory.StartNew(() => CallStoredProc2(parms));

var taskList = new List<Task> { task1, task2 };

Task.WaitAll(taskList.ToArray());

CallStoredProc1()CallStoredProc2()是私有void方法,我在其中执行存储过程调用并处理数据转换。

非常感谢任何反馈!

答案 1 :(得分:0)

您拥有的Task.WhenAll输入支持

Task。因此,首先使用Task.WhenAll确保完成所有任务。然后,使用Task.Result从所有任务中获取实际结果。