.NET, почему делает Поточную обработку. Задача. Задача все еще блокирует мой UI?

Я в настоящее время пишу приложение, которое будет управлять расположением устройства измерения. Из-за аппаратных средств, включенных, я должен постоянно опрашивать относительно значения текущей позиции при выполнении электродвигателя. Я пытаюсь создать класс, ответственный за это так, чтобы он сделал опрос на фоновом потоке и сгенерировал событие, когда желаемое положение достигнуто. Причем идея состоит в том, что опрос не заблокирует остальную часть приложения или 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 все еще заблокирован. Это похоже на Задачу, работает на основном потоке. Какие-либо идеи о том, что я делаю неправильно здесь?

Спасибо

16
задан MPelletier 28 August 2010 в 01:35
поделиться