c# - ADLS ConcurrentAppend 为 1 MB 文件提供损坏的数据
问题描述
当我使用Parallel.For
循环将 10 个 1 MB 大小的文件同时附加到 Azure Data Lake Service 时,我只看到 Azure Data Lake 文件中最后两个文件的内容,尽管我看到正确的数据打印到控制台。
当我使用简单的 for 循环而不是 thisParallel.For
时,附加到文件的数据是正确的。
有什么帮助吗?
Parallel.For(0, 10, i =>
{
path[i] = @"C:\Users\t-chkum\Desktop\InputFiles\1MB\" + (i + 1) + ".txt";
FileStream stream = File.OpenRead(path[i]);
stream.Read(buffer, 0, buffer.Length);
Console.WriteLine(Encoding.UTF8.GetString(buffer));
client.ConcurrentAppend(fileName, true, buffer, 0, buffer.Length);
stream.Close();
});
解决方案
这实际上是一个临界区问题,可以使用块集合或锁来解决:
BlockingCollection<int> b = new BlockingCollection<int>(1);
Parallel.For(0, 10, i =>
{
b.Add(i);
path[i] = @"C:\Users\t-chkum\Desktop\InputFiles\1MB\" + (i + 1) + ".txt";
FileStream stream = File.OpenRead(path[i]);
stream.Read(buffer, 0, buffer.Length);
client.ConcurrentAppend(fileName, true, buffer, 0, buffer.Length);
Array.Clear(buffer, 0, buffer.Length);
stream.Close();
b.Take();
});
上面的代码为我解决了这个问题:)
推荐阅读
- sql - 试图从两列中获取数据并正确格式化它们
- android - 如何将活动移动到具有特定片段目标的另一个活动?
- scrapy - 屈服于 s3 存储桶时无法连接蜘蛛关闭
- azure-devops - 将多个现有工作项链接到排队生成(来自 Azure Devops SDK)
- django - Django:如何请求数据并同时使其可编辑
- flutter - 如何在 Flutter 中一次运行多个下载?
- prolog - 如何在 Prolog 的主体中动态地断言具有条件的规则?
- javascript - 使用 Puppeteer 从当前页面重定向到另一个页面后如何获取 URL?
- php - Laravel strtotime没有显示正确的时间
- javascript - 使用Reducer React 方法