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

Sca*_*ety 5 c# asynchronous stored-procedures entity-framework entity-framework-6

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

  • ups_Proc1返回usp_Proc1的List
  • usp_Proc2返回usp_Proc2的List

等等....

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

List<usp_Task1> taskOneResult = await db.usp_Task1(parms).AsQueryable()
                                                         .ToListAsync();
List<usp_Task2> taskTwoResult = await db.usp_Task2(parms).AsQueryable()
                                                         .ToListAsync();
Run Code Online (Sandbox Code Playgroud)

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

更新 - 5/20/2015

最后得到了一个可行的解决方案,我相信它是并行处理所有任务的.我不得不使用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());
Run Code Online (Sandbox Code Playgroud)

CallStoredProc1()并且CallStoredProc2()是私有的void方法,我在那里执行存储过程调用并处理数据转换.

非常感谢任何反馈!

usr*_*usr 0

Task.WhenAll支持Task您拥有的输入。因此首先使用Task.WhenAll以确保所有任务均已完成。然后,使用Task.Result来获取所有任务的实际结果。