c# - 从给定目录中获取文件信息并处理N个文件以同时和顺序上传到服务器
问题描述
我需要一次处理 N 个文件,所以我已经将所有文件信息存储在Dictionary
with中Filename, Size, and SequenceNo
,现在我必须从中选择 5 个文件Dictionary
并处理该文件,同时如果任何文件的处理完成,那么它将选择另一个文件从那本词典。
例如 :
如果我在字典中有 10 个文件,我File 1, File 2, File 3, File 4, File 5
从字典中选择前 5 个文件并处理它。如果进程File 3
完成,则File 6
应该启动进程。
所以帮助我。
谢谢你。
解决方案
谢谢,@netmage 我终于找到了ConcurrentBag用户的答案,所以我会发布我自己问题的答案。
有一个命名空间提供多个线程安全的集合类,即 System.Collections.Concurrent。我使用了该命名空间中的一个,即ConcurrentBag
与List不同, ConcurrentBag包允许在我们对其进行迭代时进行修改。它也是线程安全的并允许对其进行并发访问。
我已经实现了以下代码来解决我的问题。
我已将ConcurrentBag对象FileData声明为全局。
ConcurrentBag<string[]> FileData = new ConcurrentBag<string[]>();
创建了一个函数来获取文件信息并将它们存储到FileData中。
private void GetFileInfoIntoBag(string DirectoryPath)
{
var files = Directory.GetFiles(DirectoryPath, " *", SearchOption.AllDirectories);
foreach (var file in files)
{
FileInfo f1 = new FileInfo(file);
fileData = new string[4];
fileData[0] = f1.Name;
fileData[1] = GetFileSize.ToActualFileSize(f1.Length, 2);
fileData[2] = Convert.ToString(i);
fileData[3] = f1.FullName;
i++;
FileData.Add(fileData);
}
}
然后在上传过程中,我根据需要创建了N个任务,并在其中实现了上传逻辑。
private void Upload_Click(object sender, EventArgs e)
{
List<Task> tskCopy = new List<Task>();
for (int i = 0; i < N; i++)
{
tskCopy.Add(Task.Run(() =>
{
while (FileData.Count > 0)
{
string[] file;
FileData.TryTake(out file);
if (file != null && file.Count() > 3)
{
/* Upload Logic*/
GC.Collect();
}
}
}));
}
Task.WaitAll(tskCopy.ToArray());
MessageBox.Show("Upload Complited Successfully");
}
谢谢大家的支持。
推荐阅读
- azure - 更新刷新令牌寿命 Azure AD B2C 用户流是否会使当前刷新令牌过期
- graphviz - Graphviz - 如何为每个子图设置不同的布局?
- javascript - javascript 对象方法中的新构造函数
- javascript - Azure http-trigger 函数使用 multipart/form-data 查询 HTTP POST 请求
- node.js - 在 NodeJS netlify-lambda 上运行的 Lambda 函数出错 — “TypeError: Expected signal to be an instanceof AbortSignal”
- java - 我如何在 Spring Boot 中使用 Query 和 Pageable
- mysql - 连接到 MySql 导致“连接被拒绝,没有更多信息”
- c# - 如果不活动,gRPC 连接会在 60 秒后断开
- c# - JsonSerializer 似乎忽略了时区偏移
- python - 无法将我的 Kivy 应用程序打包成 EXE。Error = (2, 'LoadLibraryExW', '系统找不到指定的文件。')