Я в настоящее время пишу приложение, которое будет управлять расположением устройства измерения. Из-за аппаратных средств, включенных, я должен постоянно опрашивать относительно значения текущей позиции при выполнении электродвигателя. Я пытаюсь создать класс, ответственный за это так, чтобы он сделал опрос на фоновом потоке и сгенерировал событие, когда желаемое положение достигнуто. Причем идея состоит в том, что опрос не заблокирует остальную часть приложения или GUI. Я хотел использовать новую Поточную обработку. Задача. Класс задачи для обработки всей инфраструктуры фонового потока для меня.
Я еще не имею аппаратных средств, но имею, создают тестовый тупик для моделирования этого поведения. Но когда я запускаю приложение как это GUI все еще блоки. Посмотрите упрощенный пример кода ниже (не завершенный и не использующий отдельный класс для управления устройствами). Код имеет последовательность измерительных шагов, приложение должно расположить и затем иметь размеры для каждого шага.
public partial class MeasurementForm: Form
{
private MeasurementStepsGenerator msg = new MeasurementsStepGenerator();
private IEnumerator<MeasurementStep> steps;
// actually through events from device control class
private void MeasurementStarted()
{
// update GUI
}
// actually through events from device control class
private void MeasurementFinished()
{
// store measurement data
// update GUI
BeginNextMeasurementStep();
}
private void MeasurementForm_Shown(object sender, EventArgs e)
{
steps = msg.GenerateSteps().GetEnumerator();
BeginNextMeasurementStep();
}
...
...
private void BeginNextMeasurementStep()
{
steps.MoveNext();
if (steps.Current != null)
{
MeasurementStarted();
MeasureAtPosition(steps.Current.Position);
}
else
{
// finished, update GUI
}
}
// stub method for device control (actually in seperate class)
public void MeasureAtPosition(decimal position)
{
// simulate polling
var context = TaskScheduler.FromCurrentSynchronizationContext();
Task task = Task.Factory.StartNew(() =>
{
Thread.Sleep(sleepTime);
}, TaskCreationOptions.LongRunning)
.ContinueWith(_ =>
{
MeasurementFinished();
}, context);
}
}
Я ожидал бы Задачу выполнить Поток. Команда сна на фоновом потоке так управление сразу возвращается к основному потоку, и GUI не становится заблокированным. Но GUI все еще заблокирован. Это похоже на Задачу, работает на основном потоке. Какие-либо идеи о том, что я делаю неправильно здесь?
Спасибо