title: How do you execute two simultaneous I/O bound tasks in ASP.NET 4.5 WebForms asynchronously?
body: <p>How do you execute both of the below methods asynchronously (StoreInSql, StoreInOtherDatabase), and then wait for both results to return before setting the label output message?  Can this be done cleanly with the await keyword?  Thank you very much.</p>
  
  <pre><code>using Microsoft.WindowsAzure.Storage;
  using Microsoft.WindowsAzure.Storage.RetryPolicies;
  using Microsoft.WindowsAzure.Storage.Table;
  using System;
  using System.Web.UI;
  
  namespace UpdateStorage
  {
      public partial class _Default : Page
      {
          protected void Page_Load(object sender, EventArgs e)
          {
              string email = "test@test.com";
  
              // It takes approximately 300 ms to store in SQL Azure
              bool sqlStorageSuccessful = MyAppStorage.StoreInSqlAzureViaEF(email);
  
              // It takes approximately 300 ms to store in Azure Table Storage
              bool otherdbStorageSuccessful = MyAppStorage.StoreInAzureTableStorage(email);
  
              if (sqlStorageSuccessful &amp;&amp; otherdbStorageSuccessful)
              {
                  labelOutputMessage.Text = "Successfully stored the email.";
              }
              else
              {
                  labelOutputMessage.Text = "We couldn't store the email, sorry!";
              }
  
              // 300ms + 300ms = It takes 600ms for this Page_Load method to complete.
              // How can I write it using the "await" keyword so that it only takes ~ 300ms?
          }
      }
      public static class MyAppStorage
      {
          public static bool StoreInSqlAzureViaEF(string s)
          {
              try
              {
                  using (MyDataModelContainer db = new MyDataModelContainer())
                  {
                      Email e = new Email();
                      e.EmailAddress = s;
                      db.SaveChanges();
                  }
              }
              catch (Exception)
              {
                  return false;
              }
              return true;
          }
          public static bool StoreInAzureTableStorage(string s)
          {
              try
              {
                  AzureEmailMessage a = new AzureEmailMessage();
                  a.EmailAddress = s;
                  a.Save();
              }
              catch (Exception)
              {
                  return false;
              }
              return true;
          }
      }
      public static class AzureStorage
      {
          private static string _ConnectionString = "DefaultEndpointsProtocol=http;AccountName=myaccount;AccountKey=mykey";
  
          static AzureStorage() { }
  
          private static CloudTable GetTableRef(string tableName)
          {
              CloudStorageAccount account = CloudStorageAccount.Parse(_ConnectionString);
              CloudTableClient tableClient = account.CreateCloudTableClient();
              IRetryPolicy linearRetryPolicy = new LinearRetry(TimeSpan.FromSeconds(2), 10);
              tableClient.RetryPolicy = linearRetryPolicy;
              CloudTable table = tableClient.GetTableReference(tableName);
              table.CreateIfNotExists();
              return table;
          }
          public static bool SaveObject(ITableEntity entity)
          {
              try
              {
                  string tableName = entity.GetType().ToString();
                  int lastNs = tableName.LastIndexOf(".");
                  if (lastNs &gt; 0)
                  {
                      tableName = tableName.Substring(lastNs + 1);
                  }
                  CloudTable table = GetTableRef(tableName);
                  TableOperation insertOperation = TableOperation.Insert(entity);
                  table.Execute(insertOperation);
                  return true;
              }
              catch (Exception)
              {
                  return false;
              }
          }
      }
      public class AzureEmailMessage : TableEntity
      {
          public string EmailAddress { get; set; }
  
          public AzureEmailMessage() { }
  
          public bool Save()
          {
              return AzureStorage.SaveObject(this);
          }
      }
  }
  </code></pre>