Los controles de formulario C # no se actualizarán con subprocesos múltiples

He estado jugando con subprocesos múltiples y leyendo algunas de las preguntas aquí, pero no he encontrado una respuesta que aborde directamente mis preocupaciones aquí.

Tengo una aplicación que se ejecuta en un solo hilo, excepto por una barra de progreso en una ventana separada. Según mi investigación, necesito crear un nuevo hilo para ese formulario que redibujará los controles del formulario a medida que cambien sus propiedades. He reducido el problema a un simple ejemplo a continuación:

Aquí está el programa 'principal':

class Program
{
    static MyForm form;

    static void Main(string[] args)
    {
        form = new MyForm();
        form.Show();

        doWork();

        form.Close();
    }

    //arbitrary example of processing that takes some period of time
    static void doWork()
    {
        while (form.Value < 100000) 
        {
            form.ChangeVal();
            Thread.Sleep(1);
        }
        return;
    }
}

... Y aquí está el formulario. No estoy incluyendo las cosas autogeneradas de VS.

public partial class MyForm : Form
{
    private int val;
    public int Value
    {
        get { return val; }
        set { val = value; }
    }

    public Thread GUIupdater;


    public MyForm()
    {
        InitializeComponent();
        this.Refresh();
    }

    private void MyForm_Load(object sender, EventArgs e)
    {
        GUIupdater = new Thread(new ThreadStart(GUIupdaterThread));
        GUIupdater.Start();

        this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(killThreadOnClose);
    }

    public void ChangeVal()
    {
        val++;
    }

    private void changeLabel(string s)
    {
        label.Text = s;
        label.Refresh();
    }
    private delegate void labelChanger(string s);
    private void GUIupdaterThread()
    {
        while (true)
        {
            Invoke(new labelChanger(changeLabel), new object[]{val.ToString()} );
            Thread.Sleep(100); //100 ms
        }
    }
    private void killThreadOnClose(object sender, FormClosingEventArgs e)
    {
        GUIupdater.Abort();
    }
}

Entonces, mi intención aquí es hacer que los cálculos se ejecuten constantemente, con los gráficos de la ventana actualizándose razonablemente rápido. Sin embargo, cuando ejecuto el programa, la función de invocación solo se llama una vez, ¡y la etiqueta nunca se actualiza!

Cualquiera y todos los comentarios son apreciados. Si desea ver el código en un IDE, puede descargar mi proyecto desdeaquí

Ediciones:

Cuando agrego las instrucciones Console.WriteLine, descubrí que el bucle GUIupdaterThread (lo que está destinado a actualizar la GUI) siempre se 'rompe' en la instrucción Invoke, nunca llega a 'Thread.Sleep'. Lo cambié a 'BeginInvoke', lo que hace que el bucle funcione correctamente, pero esto no ha cambiado el hecho de que la GUI no se actualiza.

Aclaraciones

Sobre mi proyecto 'real':

El hilo principal aquí en 'Programa' simula mi software, que es un complemento que implementa una interfaz. Mi decisión de alterar val / value en ese hilo, no en el hilo creado por la ventana, fue deliberada.Estoy obligado a usar .NET 4.0. las características más recientes no pueden ayudarme

Respuestas a la pregunta(4)

Su respuesta a la pregunta