¿Por qué Thread.Sleep () se comporta de esta manera?

Este es un código simple que he escrito:

private void button1_Click(object sender, EventArgs e)
{
    label1.Text = "first";
    Thread.Sleep(1000);
    label1.Text = "second";
}

Pero la etiqueta nunca muestra 'primero'. Lo comprobé con el punto de interrupción y la instrucción label1.text = "first" se ejecuta pero no muestra "first" en la etiqueta, solo se muestra "second"

¿Por qué esto es tan?

Respuestas a la pregunta(3)

Su respuesta a la pregunta