Параллельный процесс интенсивной функции ввода -вывода
-
27-10-2019 - |
Вопрос
У меня есть этот пример кода.
List<Dictionary<string,string>> objects = new List<Dictionary<string,string>>();
foreach (string url in urls)
{
objects.add(processUrl(url))
}
Мне нужно обработать URL, processUrl
Загрузите страницу и запустите много корпорации, чтобы извлечь некоторую информацию и вернуть объект «C# json», как « , как я могу это сделать? У меня есть много примера, но ни один из них не сохраняет возврат.
С Уважением
Решение
Как это?
var results = urls.AsParallel().Select(processUrl).ToList();
С Parallel
:
Parallel.ForEach(
urls,
url =>
{
var result = processUrl(url);
lock (syncOjbect)
objects.Add(result);
};
или же
var objects = new ConcurrentBag<Dictionary<string,string>>();
Parallel.ForEach(urls, url => objects.Add(processUrl(url)));
var result = objects.ToList();
или с задачами:
var tasks = urls
.Select(url => Task.Factory.StartNew(() => processUrl(url)))
.ToArray();
Task.WaitAll(tasks);
var restuls = tasks.Select(arg => arg.Result).ToList();
Другие советы
Во -первых, рефактор как
processUrl(url, objects);
и сделать задачу ответственной за добавление результатов в список.
Затем добавьте блокировку, чтобы две параллельные задачи не пытались использовать список результатов в одно и то же время.
Примечание: async
Поддержка в следующей версии .NET сделает это тривиально простым.
Вы можете использовать расширения Plinq, это требует .NET 4.0
System.Threading.Tasks.Parallel
.ForEach(urls, url => {
var result = processUrl(url);
lock(objects)
{
objects.Add(result);
}
});
Не связан с StackOverflow