Я работаю над 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 и провел первоначальный тест, который работает без потоков, см. Прилагаемый код.