gpt4 book ai didi

c# - 使用多个任务从大型集合中检索所有记录

转载 作者:可可西里 更新时间:2023-11-01 09:14:45 24 4
gpt4 key购买 nike

我正在开发一个调用外部服务并且必须将外部集合的所有条目添加到本地集合中的应用程序。目前的问题是外部集合可以超过1000条记录,但返回的搜索结果最多只能包含20条。

为了速度,我认为使用任务集合是前进的方向,所以我想出了下面的代码:

int totalCount = returnedCol.total_count;
while (totalCount > myDict.Count)
{
int numberOfTasks = // logic to calculate how many tasks to run

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

for (int i = 1; i <= numberOfTasks; i++)
{
Interlocked.Add(ref pageNumber, pageSize);

Task<SearchResponse> testTask = Task.Run(() =>
{
return ExternalCall.GetData(pageNumber, pageSize);
});

Thread.Sleep(100);

taskList.Add(testTask);
testTask.ContinueWith(o =>
{
foreach (ExternalDataRecord dataiwant in testTask.Result.dataiwant)
{
if (!myDict.ContainsKey(dataiwant.id))
myDict.GetOrAdd(dataiwant.id, dataiwant);
}
});
}
Task.WaitAll(taskList.ToArray());
}

然而,这并没有产生所有的结果。 pageNumber 变量每次都正确递增,但似乎并未分析所有任务结果(因为较小数据集上的单个线程上的相同逻辑会返回所有预期结果)。此外,我尝试在链中(而不是循环中)声明单个任务,并且测试数据全部返回。似乎我传递给 Thread.Sleep() 的值越高,添加到本地集合中的结果就越多(但这并不理想,因为这意味着该过程需要更长的时间!)

目前在 600 条记录的样本中,我只将大约 150-200 条添加到 myDict 集合中。我是否遗漏了一些明显的东西?

最佳答案

我认为,如果您对代码采用更实用、更少强制性的方法,您遇到难以理解的问题的可能性就会大大降低。我认为这样的事情会产生与您想要的相同的效果:

int totalCount = returnedCol.total_count;
var tasks = Enumerable.Range(1, totalCount / pageSize)
.Select(async page => {
await Task.Delay(page * 100);
return ExternalCall.GetData(page, pageSize));
})
.ToArray();
myDict = (await Task.WhenAll(tasks))
.ToDictionary(dataiwant => dataiwant.id);

以上代码假定您仍希望在请求之间等待 100 毫秒以进行节流。如果您只是在那里使用 Thread.Sleep() 来尝试解决您遇到的问题,您可以进一步简化它:

int totalCount = returnedCol.total_count;
var tasks = Enumerable.Range(1, totalCount / pageSize)
.Select(async page => await Task.Run(() => ExternalCall.GetData(page, pageSize)))
.ToArray();
myDict = (await Task.WhenAll(tasks))
.ToDictionary(dataiwant => dataiwant.id);

关于c# - 使用多个任务从大型集合中检索所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37166686/

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