Элементы управления формы 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. более новые функции не могут мне помочь