2013-08-06 47 views
1

我正在使用Simple.Data与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(); 
    } 

您可以从代码中看到以上所有我我正在从存储库中提取一些列表并将它们绑定到下拉列表。我想要异步执行这些方法而不是同步执行,请指导它如何完成?

回答

0

使用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() 
    { 
     ... 
    } 

    ... 
} 
+0

非常感谢,我明白这些将是异步调用,但不是平行的。你能帮助我们如何让它们平行吗? –

+0

他们将平行。 Task.Run从线程池获取备用线程。每个任务都在一个单独的线程中运行。 – bradgonesurfing

+0

大部分时间都在IO上等待。当任务在IO上等待时,线程返回到线程池。当任务需要继续时,从线程池中抓取另一个线程。 – bradgonesurfing

0

目前没有办法让Simple.Data做适当的异步数据库调用。工作从下一个版本开始,第一个要添加的新功能是针对那些后端(如SQL Server)的适当异步操作 - ADO提供程序具有异步方法。

+0

谢谢马克,但我想这里提出的答案在任何情况下都能正常工作,尽管Async线程不会处于simple.data级别,而是存储库调用方。 –