gpt4 book ai didi

c# - 任务不匹配输入

转载 作者:行者123 更新时间:2023-11-30 20:28:02 27 4
gpt4 key购买 nike

我有一个小问题。我有一个 BackgroundWorker,它逐行读取文本文件。我想对那些读入的行执行操作,但是这个操作需要一段时间,所以我想我可以为这类工作创建并行运行的任务。到目前为止,这是我的代码:

List<Task> tasks = new List<Task>();

using (StreamReader sr = new StreamReader(this.AppData_Path + this.Playlists_File))
{
string line = "";

while ((line = sr.ReadLine()) != null)
{
if (!string.IsNullOrWhiteSpace(line))
{
Task temp = Task.Factory.StartNew(() => AddSearchPlaylistToList(line));

tasks.Add(temp);
}

if (tasks.Count >= MaxThreads) // MaxThreads = 20
{
Task.WaitAll(tasks.ToArray());

tasks = new List<Task>();
}
}
}

现在这就是我的问题开始的地方,出于某种奇怪的原因,多个任务在同一行上工作。在提交给任务之前,我在 BackgroundWorker 中打印了这些行,它看起来像这样:

line1 345893798537598375 
line2 435803948508394534
line3 475734573478534879
line4 438348975347895798
line5 234234234234234242
...

当我在 AddSearchPlaylistToList void 中打印行参数时,由于某种原因,任务正在进行中,它看起来像这样:

line1 345893798537598375 
line1 345893798537598375
line2 435803948508394534
line2 435803948508394534
line2 435803948508394534
line3 475734573478534879
...

所以输入似乎乱七八糟,但我无法解释原因。

最佳答案

File.ReadLines已经在文件的行上返回一个枚举器,因此您不需要直接使用 StreamReader。您也不需要任务列表来收集所有任务。你可以这样写:

var tasks= File.ReadLines(somePath)
.Select(line=>Task.Run(AddSearchPlaylistToList(line)));
await Task.WhenAll(tasks);

如果您必须限制并发任务的数量(为什么?这很重要),您可以使用自定义 TaskScheduler。一个更简单的选择是使用 Parallel.ForEach具有 MaxDOP 限制,例如:

var lines=File.ReadLines(somePath);
var options = new ParallelOptions { MaxDegreesOfParallelism = 20};
Parallel.ForEach(lines,options,line=>AddSearchPlaylistToList(line));

关于c# - 任务不匹配输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47905841/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com