現在、ディスクにデータを書き込む必要があるプログラムのサブシステムで作業しています。私はこれを、マルチスレッドのProducer-Consumerモデルとして実装しました。このモデルは、あるスレッドでデータのパケットを生成し、キューに入れ、別のスレッドでディスクに書き込みます。C#、別のスレッドでイベントハンドラを実行
プログラムは最小限のCPUリソースしか必要としないため、データのパケットが到着するのを待っている間に書き込みスレッドがアイドリングしないように、パケットがキューに追加されたときにConcurrentQueueクラスを拡張してEventをトリガーしますしたがって、書き込み機能は、利用可能なデータがあるときのみアクティブになる。ここで生成する機能があります:
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++;
}
}
任意の洞察力これに感謝します!
コードなしであなたをどう助けてくれるのですか? [ask]を読んで質問を改善してください。 - そしてSOにようこそ! :) – Fildor
私の最初のアイデアは、[BlockingCollection](https://msdn.microsoft.com/en-US/library/dd267312(v = vs.110).aspx)で動作する普通の古いスレッドです止まる。その後、そのコレクションを共有して1つのスレッドで満たす必要があります。消費者スレッドは作業を行い、コレクションは並行処理を処理します。 – Fildor
なぜこれをマルチスレッドする必要がありますか?シングルスレッドでは十分速くないのですか? –