title: Using HttpClient for Asynchronous File Downloads
body: <p>I have a service which returns a csv file to a POST request. I would like to download said file using asynchronous techniques. While I can get the file, my code has a couple of outstanding problems and questions:</p>
  
  <p>1) Is this really asynchronous? </p>
  
  <p>2) Is there a way to know the length of the content even though it is being sent in chunked format? Think progress bars). </p>
  
  <p>3) How can I best monitor progress in order to hold off the program exit until all work is complete. </p>
  
  <pre><code>using System;
  using System.IO;
  using System.Net.Http;
  
  namespace TestHttpClient2
  {
      class Program
      {
          /*
           * Use Yahoo portal to access quotes for stocks - perform asynchronous operations.
           */
  
          static string baseUrl = "http://real-chart.finance.yahoo.com/";
          static string requestUrlFormat = "/table.csv?s={0}&amp;d=0&amp;e=9&amp;f=2015&amp;g=d&amp;a=4&amp;b=5&amp;c=2000&amp;ignore=.csv";
  
          static void Main(string[] args)
          {
              while (true) 
              {
                  Console.Write("Enter a symbol to research or [ENTER] to exit: ");
                  string symbol = Console.ReadLine();
                  if (string.IsNullOrEmpty(symbol))
                      break;
                  DownloadDataForStockAsync(symbol);
              }
          }
  
          static async void DownloadDataForStockAsync(string symbol)
          {
              try
              {
                  using (var client = new HttpClient())
                  {
                      client.BaseAddress = new Uri(baseUrl);
                      client.Timeout = TimeSpan.FromMinutes(5);
                      string requestUrl = string.Format(requestUrlFormat, symbol);
  
                      //var content = new KeyValuePair&lt;string, string&gt;[] {
                      //    };
                      //var formUrlEncodedContent = new FormUrlEncodedContent(content);
  
                      var request = new HttpRequestMessage(HttpMethod.Post, requestUrl);
                      var sendTask = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
                      var response = sendTask.Result.EnsureSuccessStatusCode();
                      var httpStream = await response.Content.ReadAsStreamAsync();
  
                      string OutputDirectory = "StockQuotes";
  
                      if (!Directory.Exists(OutputDirectory))
                      {
                          Directory.CreateDirectory(OutputDirectory);
                      }
  
                      DateTime currentDateTime = DateTime.Now;
                      var filePath = Path.Combine(OutputDirectory, string.Format("{1:D4}_{2:D2}_{3:D2}_{4:D2}_{5:D2}_{6:D2}_{7:D3}_{0}.csv",
                          symbol,
                          currentDateTime.Year, currentDateTime.Month, currentDateTime.Day,
                          currentDateTime.Hour, currentDateTime.Minute, currentDateTime.Second, currentDateTime.Millisecond
                          ));
  
                      using (var fileStream = File.Create(filePath))
                      using (var reader = new StreamReader(httpStream))
                      {
                          httpStream.CopyTo(fileStream);
                          fileStream.Flush();
                      }
                  }
              }
              catch (Exception ex)
              {
                  Console.WriteLine("Error, try again!");
              }
          }
  
      }
  }
  </code></pre>