我目前正在研究一个需要将数据写入磁盘的程序子系统。我已将其实现为多线程生产者 - 消费者模型,该模型在一个线程中生成数据包,将它们放入队列并将其写入另一个线程中的磁盘。
程序必须使用最少的CPU资源,因此为了避免写入线程在等待数据包到达时空闲,我扩展了ConcurrentQueue类,以便在将数据包添加到队列时触发事件,这样写功能只有在有数据可用时才有效。这是生成函数:
while (writeData)
{
for (int i = 0; i < packetLength; i++)
{
packet.data[i] = genData();
}
packet.num++;
// send packet to queue to be written
// this automatically triggers an Event
queue.Enqueue(packet);
}
我的问题是我无法弄清楚如何将事件处理程序(即:写操作)分配给一个单独的线程 - 据我所知,C#中的事件处理程序运行在触发事件的同一线程。
我考虑过使用ThreadPool,但我不确定队列中的数据包是按顺序还是并行写入。并行写入数据包在这种情况下不起作用,因为它们都被写入同一个文件,必须按照它们到达的顺序写入。这就是我到目前为止所做的:
private void writeEventCatch(object sender, EventArgs e)
{
// catch event and queue a write operation
ThreadPool.QueueUserWorkItem(writeToDisk);
}
private void writeToDisk(Object stateInfo)
{
// this is a struct representing the packet
nonCompBinData_P packet;
while (queue.TryDequeue(out packet))
{
// write packet to stream
serialiser.Serialize(fileStream, packet);
packetsWritten++;
}
}
答案 0 :(得分:0)
while(queue.TryDequeue(out packet))将退出。你需要做的是启动单线程来编写操作deque工作项并将数据写入磁盘。物品将逐一出列,并按顺序出发。