编辑和更新 -我现在在我的个人计算机上尝试了相同的代码,它工作得非常好。我能够使用相同的代码复制任何类型的文件而没有任何问题。当我在我的工作计算机上运行代码时,我遇到了这个问题。我只是不明白这如何以及为什么这取决于计算机。请让我知道我是否在这里遗漏了什么。
在 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();
}