Asp.net 如何使用Simple.Data异步执行多个DB调用
我在SQL Server中使用Simple.Data,我有多个相互独立的方法。在一个表单上,我有多个需要填充的下拉列表,我认为这些列表可以异步填充。我有一个返回实体列表的存储库 从我的Asp.Net网站上,我逐个调用存储库中的方法,并将它们绑定到下拉列表中。这是一个示例代码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
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调用方。