Controles de formulário c # não serão atualizados com multithreading

Eu tenho brincado com multithreading e lendo algumas das perguntas aqui, mas não encontrei uma resposta que atenda diretamente às minhas preocupações aqui.

Eu tenho um aplicativo que é executado em um único thread, exceto por uma barra de progresso em uma janela separada. Com base em minha pesquisa, preciso criar um novo thread para esse formulário que redesenhe os controles do formulário à medida que as propriedades forem alteradas. Reduzi o problema para um exemplo simples abaixo:

Aqui está o 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;
    }
}

... E aqui está o formulário. Não estou incluindo o material gerado automaticamente do 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();
    }
}

Portanto, minha intenção aqui é que os cálculos sejam executados constantemente, com os gráficos da janela atualizando razoavelmente rapidamente. Quando executo o programa, no entanto, a função de chamada é chamada apenas uma vez e o rótulo nunca é atualizado!

Todo e qualquer feedback é apreciado. Se você deseja visualizar o código em um IDE, pode fazer o download do meu projeto emAqui

Editar% s:

Quando adiciono as declarações Console.WriteLine, descobri que o loop GUIupdaterThread (o que deve atualizar a GUI) sempre 'quebra' na instrução Invoke, nunca atingindo 'Thread.Sleep'. Alterei para 'BeginInvoke', que faz com que o loop funcione corretamente, mas isso não mudou o fato de a GUI não ser atualizada.

ESCLARECIMENTOS:

Sobre o meu projeto 'real':

O tópico principal aqui em 'Programa' simula meu software, que é um plug-in que implementa uma interface. Minha decisão de alterar val / value nesse segmento, não no segmento criado pela janela, foi deliberada.Estou limitado a usar o .NET 4.0. quaisquer recursos mais recentes não podem me ajudar

questionAnswers(4)

yourAnswerToTheQuestion