編集と更新 -私は自分のパソコンで同じコードを試してみましたが、非常にうまく動作します。この同じコードを使用して、問題なく任意のタイプのファイルをコピーできました。仕事用のコンピューターでコードを実行すると、この問題が発生します。これがどのように、そしてなぜこれがコンピューターに依存するのか理解できません。ここで何か不足しているかどうか教えてください。
readTask では、ファイルを順次読み取り、そのバイトを BlockingCollection に追加しています。そして消費タスクでは、BlockingCollection に表示されるデータを読み取り、ファイルに書き込みます。デフォルトでは、BlockingCollection は ConcurrentQueue のラッパーであるため、ブロッキング キューからの読み取りは、書き込まれた順序と同じになると予想されます。しかし、宛先ファイルをソースと比較すると、まったく異なり、重複が見られることがあります。
私のソースファイルは、以下のように、各番号が新しい行にある一連の番号です。
1
2
3
4
5
6
7
8
9
10
私のファイルには、ファイルに十分なサイズを持たせるために約5000個の数字があります。このコードに何か問題がありますか? または、コレクションのブロックが機能するはずの方法ではありません。この例ではファイルに書き込んでいますが、実際にはこのファイルを Rest API にプッシュする必要があり、データが順番に送信されることが重要です。バイトを順番に送信できない場合、ファイルはサーバーに保存されたときに破損します。
static void Main(string[] args)
{
BlockingCollection<byte[]> bc = new BlockingCollection<byte[]>(10);
Task consumeTask = Task.Factory.StartNew(() =>
{
var fs = File.OpenWrite(@"C:\Temp\pass_new.txt");
foreach (byte[] data in bc.GetConsumingEnumerable())
{
fs.Write(data, 0, data.Length);
}
fs.Close();
});
Task readTask = Task.Factory.StartNew(() =>
{
var fs = File.OpenRead(@"C:\Temp\pass.txt");
var bufferSize = 4096;
var buffer = new byte[bufferSize];
int bytesRead = 0;
while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) != 0)
{
byte[] dataToWrite = buffer;
if (bytesRead < bufferSize)
{
dataToWrite = new byte[bytesRead];
Array.Copy(buffer, dataToWrite, bytesRead);
}
bc.Add(dataToWrite);
}
fs.Close();
}).ContinueWith(ant => bc.CompleteAdding());
consumeTask.Wait();
}