有一个生产者(硬件设备),每秒生成1000个数据包。我需要将这些数据记录到文件中。
该设备只有一个
ReadAsync()
方法,用于报告单个数据包。我需要缓冲数据包并按照它们生成的顺序将它们写入文件,每秒钟只写一次。
如果在下一批数据包准备好写入时,写操作没有及时完成,则写操作应失败。
到目前为止,我已经编写了以下代码。它可以工作,但我不确定这是否是解决问题的最佳方法。有什么建议或意见吗?在这种生产者/消费者问题中,消费者需要聚合从生产者接收到的数据的最佳实践是什么?
static async Task TestLogger(Device device, int seconds)
{
const int bufLength = 1000;
bool firstIteration = true;
Task writerTask = null;
using (var writer = new StreamWriter("test.log")))
{
do
{
var buffer = new byte[bufLength][];
for (int i = 0; i < bufLength; i++)
{
buffer[i] = await device.ReadAsync();
}
if (!firstIteration)
{
if (!writerTask.IsCompleted)
throw new Exception("Write Time Out!");
}
writerTask = Task.Run(() =>
{
foreach (var b in buffer)
writer.WriteLine(ToHexString(b));
});
firstIteration = false;
} while (--seconds > 0);
}
}