C#,在单独的线程中执行事件处理程序

时间:2017-06-29 09:22:03

标签: c# multithreading event-handling

我目前正在研究一个需要将数据写入磁盘的程序子系统。我已将其实现为多线程生产者 - 消费者模型,该模型在一个线程中生成数据包,将它们放入队列并将其写入另一个线程中的磁盘。

程序必须使用最少的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++;
        }
    }

1 个答案:

答案 0 :(得分:0)

只要没有要出队的数据包,

while(queue.TryDequeue(out packet))将退出。你需要做的是启动单线程来编写操作deque工作项并将数据写入磁盘。物品将逐一出列,并按顺序出发。