title: How to return async HttpClient responses back to WinForm?
body: <p>Up until now, I've been making synchronous HttpWebRequest calls in WinForms applications. I want to start doing it asynchronously so as to not block the UI thread and have it hang. Therefore, I am attempting to switch to HttpClient, but I am also new to async and tasks and don't quite get it, yet.</p>
  
  <p>I can launch the request and get a response and isolate the data I want (result, reasonPhrase, headers, code) but don't know how to get that back for display in textBox1. I also need to capture ex.message and return to the form if a timeout or cannot connect message occurs.</p>
  
  <p>Every single example I see has the values written to Console.WriteLine() at the point they are available, but I need them returned back to the form for display and processing and have a hard time understanding how.</p>
  
  <p>Here's a simple example:</p>
  
  <pre><code>namespace AsyncHttpClientTest
  {
      public partial class Form1 : Form
      {
          public Form1()
          {
              InitializeComponent();
          }
          private void button1_Click(object sender, EventArgs e)
          {
              textBox1.Text = "calling Test()...\r\n";
              DownloadPageAsync();
  
              // need to get from DownloadPageAsync here: result, reasonPhrase, headers, code 
  
              textBox1.AppendText("done Test()\r\n");
          }
          static async void DownloadPageAsync()
          {
              // ... Use HttpClient.
              using (HttpClient client = new HttpClient())
              {
                  try
                  {
                      using (HttpResponseMessage response = await client.GetAsync(new Uri("http://192.168.2.70/")))
                      {
                          using (HttpContent content = response.Content)
                          {
                              // need these to return to Form for display
                              string result = await content.ReadAsStringAsync();
                              string reasonPhrase = response.ReasonPhrase;
                              HttpResponseHeaders headers = response.Headers;
                              HttpStatusCode code = response.StatusCode;
                          }
                      }
                  }
                  catch (Exception ex)
                  {
                      // need to return ex.message for display.
                  }
              }
          }
      }
  }
  </code></pre>
  
  <p>Any helpful hints or advice?</p>