Элементы управления формы C # не будут обновляться при многопоточности

Я играл с многопоточностью и читал некоторые вопросы здесь, но я не нашел ответа, который бы напрямую касался моих проблем здесь.

У меня есть приложение, которое работает в одном потоке, за исключением индикатора выполнения в отдельном окне. Основываясь на моих исследованиях, мне нужно создать новый поток для этой формы, который будет перерисовывать элементы управления формы при изменении ее свойств. Я сократил проблему до простого примера ниже:

Вот основная программа:

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

... А вот и форма. Я не включаю автоматически сгенерированные вещи из 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();
    }
}

Итак, мое намерение здесь состоит в том, чтобы расчеты выполнялись постоянно, при этом графика окна обновлялась достаточно быстро. Однако когда я запускаю программу, функция invoke вызывается только один раз, а метка никогда не обновляется!

Любая обратная связь приветствуется. Если вы хотите просмотреть код в IDE, вы можете скачать мой проект сВот

Редактирование:

Когда я добавил Console.WriteLine Statements, я обнаружил, что цикл GUIupdaterThread (предназначенный для обновления GUI) всегда «разрывается» в операторе Invoke, никогда не достигая «Thread.Sleep». Я изменил его на «BeginInvoke», что заставляет цикл работать должным образом, но это не изменило тот факт, что графический интерфейс не обновляется.

ПОЯСНЕНИЯ:

О моем «реальном» проекте:

Основной поток здесь, в «Программе», имитирует мое программное обеспечение, которое представляет собой плагин, реализующий интерфейс. Мое решение изменить val / value в этом потоке, а не в потоке, созданном окном, было осознанным.Я вынужден использовать .NET 4.0. более новые функции не могут мне помочь

Ответы на вопрос(4)

Ваш ответ на вопрос