Как реализовать шаблон многопоточности / наблюдателя задачи? - PullRequest
0 голосов
/ 30 мая 2019

Я работаю над DAQ / инструментарием, который должен передавать большие массивы данных (двойного типа) с / на устройства HW, например, платы DAQ или звуковые карты.Каждое устройство HW имеет буфер и будет вызывать обратные вызовы, когда входной буфер заполнен.Буфер должен быть помещен в буфер для нескольких инструментов SW, например, осциллографа и анализатора спектра.Каждый инструмент, а также драйвер устройства должны работать в отдельных потоках / задачах.Мое намерение состоит в том, чтобы обрабатывать примерно 1 миллион двойных точек в секунду.

Для отправки данных я посмотрел на IObservable / IObserver и провел первоначальный тест, который работает без потоков.Тип данных выглядит следующим образом:

public interface IAnalogInArrayData
{
        int NumberOfChannels { get; }
        int NumberOfPoints { get; }
        string[] XUnits { get; }
        string[] YUnits { get; }

        double[][] GetXData();
        double[][] GetXYata();
}

Значение типа double [] [] может быть до [8] [10000] и обновляться каждые 100 мсек.

Теперь я хочу перейти кмногопоточность (или задачи).Я провел некоторое исследование, и я несколько смущен доступными альтернативами:

  • в соответствии со старым сообщением SOF (к сожалению, я его потерял), IObservable / IObserver следует заменить на Reactive extensions и Subject.Однако, согласно MSDN, вводная страница Rx больше не обновляется, но нет никаких предложений относительно того, что следует использовать вместо этого.
  • TPL: это, похоже, очень высокопроизводительная многопоточная среда, но я заблудился во всех опциях

Как сделать поток IObservable / IObserver безопасным?Должен ли я пропустить темы и использовать задачи напрямую?Я должен использовать Rx, TPL или я пропускаю какие-либо альтернативы?Каковы плюсы и минусы каждого подхода?Обратная связь приветствуется.

Для получения данных я посмотрел на IObservable / IObserver и провел первоначальный тест, который работает без потоков, см. Прилагаемый код.

...