Я хотел бы сделать следующее:Как выполнить фоновое задание без блокировки GUI, но передать обратно информацию в основной поток?
- Есть кнопки и таблицу на GUI.
- При нажатии на кнопку, задача запускается
- Эта задача является цикл в то время, давая мне данные на каждой итерации
Как я могу запустить этот цикл и получить данные от каждой итерации этого в основной таблицы GUI, без блокировки GUI? Это важно, потому что условие останова снова является кнопкой в графическом интерфейсе.
Я попытался использовать BackgroundWorker
, но я действительно не могу понять, как отправлять данные на каждой итерации цикла (???). Я могу вернуть результат в конце, но это не цель. Если я запустил работника в цикле (но не имеет цикла в рабочем), он не работает.
private void ContinuousCoordinateAquisition(object sender, DoWorkEventArgs e)
{
while (continuousPositionAquisitionFlag == true) // while the monitoring is not stopped, get positions
{
// get xyzwpr world coordinates
robotCoordinatesXYZWPRworld XYZWPRworld = robi.getRobotPosition_xyzwpr_world();
Do something........... retuns values I need in GUI
// sleep for defined time
System.Threading.Thread.Sleep(1000); // wait
}
}
вызывающему будет
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(ContinuousCoordinateAquisition);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(ContinuousCoordinateAquisitionCompleted);
continuousPositionAquisitionFlag
устанавливается из (кнопка стоп) кнопки. ContinuousCoordinateAquisitionCompleted
здесь сделано только один раз, к сожалению, не каждая итерация.
_Reactive Extensions_ ваш друг – MickyD
Б имеют событие ProgressChanged, идеально подходят для отправка данных в основной поток. –
Но когда вы делаете паузу в течение 1000 мс каждый цикл, вам может быть лучше с таймером. –