Use async/await but don't return a Task from each routine. The effect is that they run concurrently all awaiting on their own io and then complete on the UI thread.
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()
{
...
}
...
}