書き込み操作が実行されているファイルの配列がありますParallel.ForEach
。これを高速化するためにループを使用しています。
問題は、複数のスレッドがある場合、そのスレッドが不規則に動作することです。プログラムは、WAVファイルに250000ランダムバイトを10回書き込みます。これにより、約1.3秒の静的期間が発生します。何が起こっているのかというと、複数のスレッドでは、ファイルの大部分に静的なものはなく、Windowsはファイルが変更されたことを示しますが、オーディオコンテンツは変更されていません。他の問題は、一部のクリップに約6分の静的なものがあったことです。それに書き込まれることは不可能ですが、コードは各ファイルに2500000バイト(〜10.3秒)しか書き込みません。そのため、何らかの理由で間違ったファイルにバイトを書き込むため、静的なファイルがないものもあれば、ばかげた量のファイルもあります。静電気を見逃すことは不可能なので、私にはなれません。私は何かがうまくいかないことを知っています。
プログラムをマルチスレッド化する前はすべて正常に機能していたので、使用MaxDegreeofParallelism = 1
してすべてが正常に機能したので、問題の原因は複数のスレッドであることがわかります。
Parallel.ForEach(files, new ParallelOptions{MaxDegreeOfParallelism = 4}, file =>
{
Random rand = new Random();
using (stream = new FileStream(file, FileMode.Open, FileAccess.ReadWrite))
{
FileInfo info = new FileInfo(file);
for (int i = 0; i < 10; i++)
{
int pos = rand.Next(5000000, Convert.ToInt32(info.Length));
for (int x = 0; x < 250000; x++)
{
byte number = array[rand.Next(array.Length)];
stream.Seek(pos, SeekOrigin.Begin);
pos += 4;
stream.WriteByte(number);
}
}
}
});
編集:他の問題は、複数のスレッドで重要なデータを含むヘッダー部分に書き込むため、メディアプレーヤーがフォーマットを認識しないことです。これは複数のスレッドでのみ発生し、最初の500万バイトは無視しています。これで十分です。
編集:2更新されたコード。
私のコードが正しく機能しない原因となる複数のスレッドについて誰かが光を当てることができますか?