Реализую приложение, в котором должны работать два потока: один - это основной поток (поток для GUI), а во втором потоке необходимо опрашивать устройство на com-порту и выводить полученные с него данные на GUI-элемент.
Решил сперва опробовать как вообще работает многопоточное программирование в Gtk#, для чего написал следующий код:
Thread backgroundThread;
protected void OnButton1Clicked (object sender, EventArgs e)
{
backgroundThread=new Thread(thread_Process);
backgroundThread.Start();
}
private void thread_Process ()
{
for (Int32 i=0; i!=10; i++)
{
Gtk.Application.Invoke (delegate {
entry1.Text = entry1.Text+ i;
}
);
//Thread.Sleep(1000);
}
}
Ожидал в entry1 увидеть: "0123456789", но получил: "10101010101010101010". Как понимаю, такое произошло из-за того, что значение переменной i еще не сохранилось в поле Text объекта entry1, но измениться уже изменилось (i++). Немного исправил:
for (Int32 i=0; i!=10; i++)
{
String val=i.ToString();
Gtk.Application.Invoke (delegate {
entry1.Text = entry1.Text+ val;
}
);
//Thread.Sleep(1000);
}
Получил ожидаемый результат: "0123456789", но скромно считаю, что это не самое удачное решение, т.к. 10 раз выделять память под переменную val - это слишком (допустим, что итераций цикла не 10, а 10000 - памяти немало уйдет).
Как можно видеть, и в первом и во втором коде закомментирована строка Thread.Sleep(1000), т.е. усыпить поток на 1 секунду, но это также не решает проблемы.
Подскажите пожалуйста, каким образом можно более рационально решить указанную задачу, т.е. как не тратя лишней памяти получить на выходе корректный результат?