バイナリ ファイルを処理する次のコードがあります。スレッドを使用し、バイナリ ファイルの各行を ThreadPool 内のスレッドに割り当てることで、処理負荷を分割したいと考えています。各行の処理時間はわずかですが、数百行を含む可能性のあるファイルを処理する場合、ワークロードを分割することは理にかなっています。
私の質問は BinaryReader とスレッド セーフに関するものです。まず第一に、私がやっていることは許容範囲内です。PROCESS_Binary_Return_lineData メソッドには、各行のバイナリのみを渡す方がよいと感じています。
以下のコードは概念的なものであることに注意してください。マルチスレッドに関する私の知識はまだ始まったばかりなので、これに関する少しのガイダンスを探しています。おそらく、同じ結果を達成するためのより良い方法、つまり各バイナリ行の分割処理があります。
var dic = new Dictionary<DateTime, Data>();
var resetEvent = new ManualResetEvent(false);
using (var b = new BinaryReader(File.Open(Constants.dataFile,
FileMode.Open, FileAccess.Read, FileShare.Read)))
{
var lByte = b.BaseStream.Length;
var toProcess = 0;
while (lByte >= DATALENGTH)
{
b.BaseStream.Position = lByte;
lByte = lByte - AB_DATALENGTH;
ThreadPool.QueueUserWorkItem(delegate
{
Interlocked.Increment(ref toProcess);
var lineData = PROCESS_Binary_Return_lineData(b);
lock(dic)
{
if (!dic.ContainsKey(lineData.DateTime))
{
dic.Add(lineData.DateTime, lineData);
}
}
if (Interlocked.Decrement(ref toProcess) == 0) resetEvent.Set();
}, null);
}
}
resetEvent.WaitOne();