C# 对SQL数据执行多个异步调用是否有什么好处?

C# 对SQL数据执行多个异步调用是否有什么好处?,c#,sql,.net,async-await,task-parallel-library,C#,Sql,.net,Async Await,Task Parallel Library,以下是我的设置: public class Workflow { List<Detail> Details; List<Notification> Notifications; List<Machine> Machine; public Workflow GetWorkflowInformation(int workflowID) { Task<Workflow> workflowTask

以下是我的设置:

public class Workflow
{
    List<Detail> Details;
    List<Notification> Notifications;
    List<Machine> Machine;

    public Workflow GetWorkflowInformation(int workflowID)
    {
        Task<Workflow> workflowTask = fillInWorkflowInfo(workflowID);
        Task<List<Detail>> detailsTask = getDetails(workflowID);
        Task<List<Notify>> notifyTask = getNotifications(workflowID);
        Task<Machine> machineTask = getMachine();

        Workflow workflow = workflowTask.Result;
        workflow.Details = detailsTask.Result;
        workflow.Notifications = notifyTask.Result;
        workflow.Machine = machineTask.Result;

        return workflow;
    }

    private async Task<List<Detail>> getDetails(int workflowID)
    {
        List<Detail> details = new List<Detail>();
        await Task.Run( () = >
        {
            details = Detail.GetDetailsForWorkflow(workflowID);
        }
    }

    private async Task<List<Notify>> getNotifications(int workflowID)
    {
        List<Notify> notifications = new List<Notify>();
        await Task.Run( () = >
        {
            notifications = Notify.GetNotificationsForWorkflow(workflowID);
        }
        return notifications;
    }

    private async Task<Machine> getMachine(int workflowID)
    {
        Machine machine = new Machine();
        await Task.Run( () = >
        {
            Machine.GetMachineForWorkflow(workflowID);
        }
        return machine;
    }

    private async Task<Workflow> fillInWorkflowInfo(int workflowID)
    {
        Workflow workflow = new Workflow();
        await Task.Run( () = >
        {
            workflow = GetWorkflowInformation(workflowID);
        }
        return workflow;
    }
}
公共类工作流
{
列出详情;
列出通知;
列表机;
公共工作流GetWorkflowInformation(int workflowID)
{
任务workflowTask=填写WorkflowInfo(workflowID);
Task detailsTask=getDetails(workflowID);
任务notifyTask=getNotifications(workflowID);
任务机器Task=getMachine();
工作流=workflowTask.Result;
workflow.Details=detailsTask.Result;
workflow.Notifications=notifyTask.Result;
workflow.Machine=machineTask.Result;
退货流程;
}
私有异步任务getDetails(int workflowID)
{
列表详细信息=新列表();
等待任务。运行(()=>
{
details=Detail.GetDetailsForWorkflow(workflowID);
}
}
专用异步任务getNotifications(int workflowID)
{
列表通知=新列表();
等待任务。运行(()=>
{
通知=Notify.GetNotificationsForWorkflow(workflowID);
}
退货通知;
}
专用异步任务getMachine(int workflowID)
{
机器=新机器();
等待任务。运行(()=>
{
Machine.GetMachineForWorkflow(workflowID);
}
返回机;
}
专用异步任务fillInWorkflowInfo(int-workflowID)
{
工作流=新工作流();
等待任务。运行(()=>
{
工作流=GetWorkflowInformation(workflowID);
}
退货流程;
}
}
上面的每一个方法都对应一个SQL server调用。我想知道通过执行多个异步/等待调用(因为我的SQL server可以同时处理多个调用)是否会有所收获,或者这是否只是因为无意中听到而使我的速度变慢,或者我没有正确实现某些功能


我对async/await相当陌生,所以我想看看这是否是一个合适的实现,或者我是否完全遗漏了一些东西。

您所做的不是真正的异步。您只是将工作卸载到执行查询时阻塞的不同线程

并行执行多个查询可以使单个流更快地完成,但并不比逐个执行这些查询更有效


为了实际减少所需的资源(即线程),操作本身需要是异步的(而不仅仅是通过
Task.Run
卸载)。这需要您使用的客户端库的支持。

您所做的不是真正的异步。您只是将工作卸载到执行查询时被阻止的不同线程

并行执行多个查询可以使单个流更快地完成,但并不比逐个执行这些查询更有效


为了实际减少所需的资源(即线程),操作本身需要是异步的(而不仅仅是通过
Task.Run
卸载)。这需要您使用的客户端库的支持。

您不是一次进行所有这些调用。您是按顺序进行的。异步!=并行。而且,您不是真正的异步。您正在旋转一个线程,然后等待它完成。有没有办法将其调整为并行?@MarcinJuraszek它不是异步的,但它是并行的。每个任务中的thod调用。Run只需设置并执行SQL调用。鉴于此,您认为并行调用它们有好处吗?还是我只是阻止了线程?@oppassum您肯定只是阻止了线程。好处是整个操作会更快完成,但也需要更多的资源。您没有完成所有的任务se立即调用。您正在按顺序进行调用。异步!=并行。此外,您不是真正的异步。您正在旋转线程,然后等待它完成。有没有办法将其调整为并行的?@MarcinJuraszek它不是异步的,但它是并行的。任务中的每个方法调用。Run只需设置并执行SQL调用。鉴于此,您知道吗认为并行调用它们是一个好处?还是我只是阻塞线程?@oppassum您肯定只是阻塞线程。好处是整个操作将更快完成,但它也需要更多资源。