C# 同步处理异步输入

C# 同步处理异步输入,c#,events,asynchronous,C#,Events,Asynchronous,我正在解析由模拟键盘的usb设备生成的相当复杂的数据流。对我来说,概念化和处理数据最简单的方法是,如果我有一个名为GetNextInputCharacter的方法,我可以一次完成所有解析,而不必在接收输入时一次完成一部分。不幸的是,我不知道流中应该包含多少字节,直到我对它进行了显著的解析,我也不愿意等到最后再解析它 是否有任何机制或设计模式可以从键事件获取异步输入,并根据需要将其传递给我的解析方法?我所能想到的就是一个IEnumerable,它对一个FIFO进行繁忙的等待,关键事件填充该FIFO

我正在解析由模拟键盘的usb设备生成的相当复杂的数据流。对我来说,概念化和处理数据最简单的方法是,如果我有一个名为
GetNextInputCharacter
的方法,我可以一次完成所有解析,而不必在接收输入时一次完成一部分。不幸的是,我不知道流中应该包含多少字节,直到我对它进行了显著的解析,我也不愿意等到最后再解析它


是否有任何机制或设计模式可以从键事件获取异步输入,并根据需要将其传递给我的解析方法?我所能想到的就是一个IEnumerable,它对一个FIFO进行繁忙的等待,关键事件填充该FIFO并一次生成一个FIFO。这看起来有点像黑客,但也许会奏效。我只是想要一种方式,让解析例程假装输入已经存在,并在不知道它必须等待事件的情况下接受它。

解析流,并使解析器阻塞,直到它有足够的字符来生成合理的结果,怎么样?然后,来自USB设备的异步数据就可以写入流了。您可能必须编写自己的流实现,但这并不难


顺便说一句,这是一种非常常见的模式-当您使用内置的.net序列化时,反序列化程序会阻止读取可能通过网络套接字传入的输入流。

如何解析流,并使解析器阻塞,直到它有足够的字符来生成合理的结果?然后,来自USB设备的异步数据就可以写入流了。您可能必须编写自己的流实现,但这并不难


顺便说一句,这是一种非常常见的模式-当您使用内置的.net序列化时,反序列化程序会阻止读取可能通过网络套接字传入的输入流。

类似的情况如何:

        ...
        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();
        }
。。。
var stream=//设置流
var data=从StreamStuff(流)中的数据流选择数据流;
...
私有IEnumerable StreamStuff(流)
{
stream.Open();
while(stream.Read())
{
//做一些有助于提高阅读价值的事情
返回处理后的数据;
}
stream.Close();
}

像这样的东西怎么样:

        ...
        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();
        }
。。。
var stream=//设置流
var data=从StreamStuff(流)中的数据流选择数据流;
...
私有IEnumerable StreamStuff(流)
{
stream.Open();
while(stream.Read())
{
//做一些有助于提高阅读价值的事情
返回处理后的数据;
}
stream.Close();
}