У меня есть следующий код, который обрабатывает двоичный файл. Я хочу разделить рабочую нагрузку, используя потоки и назначая каждую строку двоичного файла потокам в 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();