C# 在任务中包装实体框架存储的过程执行代码

C# 在任务中包装实体框架存储的过程执行代码,c#,task-parallel-library,C#,Task Parallel Library,我对C#中异步行为的了解有些生疏,我想知道将某些代码更改为by async是否会对我们有益,或者它是否会降低代码的效率 我有一组方法,每个方法通过实体框架执行一个存储过程。我们返回一个IEnumerable 这个集合中的每个方法都可以独立于其他方法运行,所以我开始考虑并行运行它们 一位以前的同事告诉我,DB查询都是同步运行的,在任务中包装DB调用代码会降低系统的速度,这一点突然出现在我的脑海中 在任务中包装DB调用代码是否有好处?或者 我是否会通过在任务中包装DB调用来降低系统速度 数据库查询

我对C#中异步行为的了解有些生疏,我想知道将某些代码更改为by async是否会对我们有益,或者它是否会降低代码的效率

我有一组方法,每个方法通过实体框架执行一个存储过程。我们返回一个
IEnumerable

这个集合中的每个方法都可以独立于其他方法运行,所以我开始考虑并行运行它们

一位以前的同事告诉我,DB查询都是同步运行的,在任务中包装DB调用代码会降低系统的速度,这一点突然出现在我的脑海中

  • 在任务中包装DB调用代码是否有好处?或者
  • 我是否会通过在任务中包装DB调用来降低系统速度
  • 数据库查询是否都以同步方式执行
我们的方法如下所示:

private IEnumerable<Models.Permission> PermissionsForUser(Context entities,int userId)
{
    var userperms = entities.sssp_GetUserPermissions(userId);
    return ...
}
private IEnumerable PermissionsFruser(上下文实体,int userId)
{
var userperms=entities.sssp_GetUserPermissions(userId);
返回。。。
}

任务并行库不会降低代码的速度,在.net中引入该库是为了利用当前存在的多核处理器

所以,若您向数据库触发两个查询,这两个查询彼此都不依赖,那个么您可以创建两个任务并调用数据库来并行执行代码

默认运行任务如果要创建长时间运行的任务,请使用线程池。由于调用数据库可能是长时间运行的任务,因此我建议您使用TaskCreationOptions.LongRunning来创建长时间运行的任务

示例代码如下:

 Task[] tasks = new Task[2];

task[0] = Task.Factory.StartNew(calltodatabase1
                      , TaskCreationOptions.LongRunning
                      , cancellationTokenSource.Token); 
task[1] = Task.Factory.StartNew(calltodatabase2
                      , TaskCreationOptions.LongRunning
                      , cancellationTokenSource.Token); 

Task.WaitAll(tasks);
在任务中包装DB调用代码是否有好处

那要看情况。如果您所说的
Task
是指“使用数据提供者公开的自然异步API”,例如ADO.NET或Entity Framework公开的XXXAsync,那么如果您有并发请求访问您的数据库,并且您希望同时释放线程来处理其他请求,这可能会有所帮助。它肯定不会加快您的查询速度

我是否会通过在任务中包装DB调用来降低系统速度

同样,这要看情况而定。你的第一个问题和你所说的“任务”也是一样的。您必须记住
任务!=线程
。如果您想通过调用
Task.Run
来包装数据库查询,您将有效地使用反模式。这可能也会减慢您的查询速度,您必须进行基准测试才能确定

数据库查询是否都以同步方式执行

数据库查询可以同步执行,也可以异步执行,具体取决于提供程序公开的API。进行数据库调用自然是异步的,这意味着不需要为这些查询使用任何额外的线程来释放正在使用的线程。如果您有多个可以并发执行的查询,那么使用这些asynchorouns API可以从中获益