J'ai le code suivant qui traite un fichier binaire. Je veux diviser la charge de travail de traitement en utilisant des threads et en assignant chaque ligne du fichier binaire aux threads dans le ThreadPool. Le temps de traitement pour chaque ligne est limité, mais lorsqu'il s'agit de fichiers pouvant contenir des centaines de lignes, il est judicieux de diviser la charge de travail.Fichier binaire de processus C#, traitement multi-thread
Ma question concerne le BinaryReader et la sécurité des threads. Tout d'abord, est ce que je fais ci-dessous acceptable. J'ai le sentiment qu'il vaudrait mieux ne passer que le binaire de chaque ligne à la méthode PROCESS_Binary_Return_lineData.
Veuillez noter que le code ci-dessous est conceptuel. Je suis à la recherche d'un guide, mais mes connaissances en matière de multi-threading n'en sont qu'à leurs balbutiements. Il existe peut-être un meilleur moyen d'obtenir le même résultat, c'est-à-dire de diviser le traitement de chaque ligne binaire.
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();
serait-ce des tableaux d'octets dérivés de: - var LineBytes = b.ReadBytes (DATALENGTH); ou devrais-je cloner les données dans un tableau d'octets pour m'assurer qu'il ne fait plus référence au flux de fichiers. – washtik
Vous devriez simplement pouvoir utiliser le résultat de b.ReadBytes (DATALENGTH). – cHao