Обрабатывать асинхронный ввод синхронно - PullRequest
0 голосов
/ 24 января 2012

Я работаю над анализом довольно сложного потока данных, генерируемого USB-устройством, которое эмулирует клавиатуру.Самый простой способ для меня осмыслить и разобраться с данными был бы, если бы у меня был метод, называемый чем-то вроде GetNextInputCharacter, и я мог бы выполнять весь анализ за один раз, не выполняя по одному фрагменту за раз, когда я получаю ввод,К сожалению, я не буду знать, сколько байтов ожидать в потоке, пока я не проанализирую его значительно, и я бы предпочел не ждать конца для его анализа.

Существует ли какой-либо механизм или шаблон проектирования, которыйможет принять асинхронный ввод из ключевого события и передать его моему методу разбора по требованию?Все, что я могу придумать, это IEnumerable, который занят в ожидании FIFO, который заполняет ключевое событие и выдает их по одному за раз.Это похоже на взлом, но, возможно, это сработает.Я просто хочу, чтобы процедура синтаксического анализа притворялась, будто вход уже есть, и принимала его, не зная, что она должна ждать события.

Ответы [ 2 ]

2 голосов
/ 24 января 2012

Как насчет анализа потока и создания блока синтаксического анализа до тех пор, пока в нем не будет достаточно символов, чтобы получить разумный результат?Тогда асинхронные данные с устройства USB можно просто записать в поток.Возможно, вам придется написать свою собственную реализацию Stream, но это не так уж сложно.

Кстати, это достаточно распространенный шаблон - когда вы используете встроенную сериализацию .net, блок десериализаторовпри чтении входного потока, который может поступать через сетевой сокет.

1 голос
/ 24 января 2012

Как насчет этого:

        ...
        var stream = //Set up stream 
        var data = from dataStream in StreamStuff(stream) select dataStream;
        ...
        private IEnumerable<String> StreamStuff(Stream stream)
        {
            stream.Open();
            while(stream.Read())
            {
                //Do some stuff to your read value
                yield return yourProcessedData;
            }
            stream.Close();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...