Я работаю над приложением, которое вызывает внешнюю службу, и должен добавить все записи внешней коллекции в локальную коллекцию. В настоящее время проблема заключается в том, что внешняя коллекция может превышать 1000 записей, но возвращаемые результаты поиска могут включать до двадцати элементов.
Для скорости, которую я решил использовать, сборка Задач будет способом продвижения вперед, поэтому я придумал код ниже:
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
. Мне что-то не хватает?