我有以下处理二进制文件的代码。我想通过使用线程并将二进制文件的每一行分配给 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();