¿Cómo devolver respuestas HttpClient asíncronas a WinForm?

Hasta ahora, he estado haciendo llamadas HttpWebRequest sincrónicas en aplicaciones WinForms. Quiero comenzar a hacerlo de forma asincrónica para no bloquear el hilo de la interfaz de usuario y colgarlo. Por lo tanto, estoy intentando cambiar a HttpClient, pero también soy nuevo en async y tareas y todavía no lo entiendo.

Puedo iniciar la solicitud y obtener una respuesta y aislar los datos que quiero (resultado, frase de frase, encabezados, código) pero no sé cómo recuperarlos para mostrarlos en textBox1. También necesito capturar ex.message y volver al formulario si se produce un mensaje de tiempo de espera o no se puede conectar.

Cada ejemplo que veo tiene los valores escritos en Console.WriteLine () en el momento en que están disponibles, pero necesito que vuelvan al formulario para su visualización y procesamiento y me cuesta entender cómo.

Aquí hay un ejemplo simple:

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.
                }
            }
        }
    }
}

¿Alguna sugerencia o consejo útil?

Respuestas a la pregunta(1)

Su respuesta a la pregunta