Asp.net 如何使用Simple.Data异步执行多个DB调用

Asp.net 如何使用Simple.Data异步执行多个DB调用,asp.net,async-await,simple.data,Asp.net,Async Await,Simple.data,我在SQL Server中使用Simple.Data,我有多个相互独立的方法。在一个表单上,我有多个需要填充的下拉列表,我认为这些列表可以异步填充。我有一个返回实体列表的存储库 从我的Asp.Net网站上,我逐个调用存储库中的方法,并将它们绑定到下拉列表中。这是一个示例代码 private void Initialize() { LoadTechnologies(); LoadInstallationTypes(); LoadProvinc

我在SQL Server中使用Simple.Data,我有多个相互独立的方法。在一个表单上,我有多个需要填充的下拉列表,我认为这些列表可以异步填充。我有一个返回实体列表的存储库

从我的Asp.Net网站上,我逐个调用存储库中的方法,并将它们绑定到下拉列表中。这是一个示例代码

private void Initialize()
    {
        LoadTechnologies();
        LoadInstallationTypes();
        LoadProvinces();
        LoadYears();            
    }

    private void LoadTechnologies()
    {
        ddlTechnologies.DataSource = _GizRepository.GetTechnologies();
        ddlTechnologies.DataValueField = "Name";
        ddlTechnologies.DataTextField = "Name";
        ddlTechnologies.Items.Insert(0, new ListItem("All", "-1"));
        ddlTechnologies.DataBind();
    }

    private void LoadInstallationTypes()
    {
        ddlInstallationType.DataSource = _GizRepository.GetInstallationTypes();
        ddlInstallationType.DataValueField = "Type";
        ddlInstallationType.DataTextField = "Type";
        ddlInstallationType.Items.Insert(0, new ListItem("Any", "-1"));
        ddlInstallationType.DataBind();
    }

    private void LoadProvinces()
    {
        ddlProvinces.DataSource = _GizRepository.GetProvinces();
        ddlProvinces.DataValueField = "Name";
        ddlProvinces.DataTextField = "Name";
        ddlProvinces.Items.Insert(0, new ListItem("All", "-1"));
        ddlProvinces.DataBind();
    }

    private void LoadYears()
    {
        ddlYearFrom.DataSource = _GizRepository.GetYears();
        ddlYearFrom.DataValueField = "Year";
        ddlYearFrom.DataTextField = "Year";
        ddlYearFrom.DataBind();

        ddlYearTo.DataSource = _GizRepository.GetYears();
        ddlYearTo.DataValueField = "Year";
        ddlYearTo.DataTextField = "Year";
        ddlYearTo.DataBind();
    }

从上面的代码可以看出,我所做的只是从存储库中获取一些列表,并将它们绑定到下拉列表。我想异步执行这些方法,而不是同步执行,请指导如何执行

使用async/await,但不要从每个例程返回任务。其效果是,它们在自己的io上并行运行,然后在UI线程上完成

private void Initialize()
    {
        LoadTechnologies();
        LoadInstallationTypes();
        LoadProvinces();
        LoadYears();            
    }

    // Note that LoadTechnologies will return as soon as it is
    // called. The part after the await will be scheduled on
    // the UI thread after the task completes with the data
    private async Task LoadTechnologies()
    {
        ddlTechnologies.Datasource = 
            await Task.Run(()=>GizRepository.GetTechnologies());
        ddlTechnologies.DataValueField = "Name";
        ddlTechnologies.DataTextField = "Name";
        ddlTechnologies.Items.Insert(0, new ListItem("All", "-1"));
        ddlTechnologies.DataBind();
    }

    private async Task LoadInstallationTypes()
    {
        ...
    }

    ...
}

目前还没有简单的方法。数据可以进行适当的异步数据库调用。下周将开始第2版的工作,要添加的第一个新功能是针对那些后端(如SQL Server)的适当异步操作,其中ADO提供程序具有异步方法。

非常感谢,我知道这些将是异步调用,但不是并行调用。你能帮助我们如何使它们平行吗?它们将是平行的。Task.Run从线程池中获取一个备用线程。每个任务都在一个单独的线程中运行。在这里花费的大部分时间将用于等待IO。当任务在IO上等待时,线程将返回到线程池。当任务需要继续执行时,会从线程池中抓取另一个线程。我会让这些方法返回任务,以便希望等待它们的人实际上可以这样做。只要不等待Initialize中的调用,它们仍将并行执行。我还将向方法中添加异步后缀,以遵循标准。@cremor添加了任务返回类型。感谢Mark,但我认为这里建议的答案在任何情况下都会很好地工作,尽管异步线程不是在simple.data级别,而是在repository调用方。