Я новичок в C #, Parallel.ForEach
и .NET в целом. Я хочу распараллелить поиск, который включает тысячи местоположений. Для каждого местоположения я вычисляю большое расстояние по кругу. Это расчет, который я хочу распространить на разные ядра. Мой вопрос: как мне это сделать, если у меня есть только одна локальная переменная потока, как в этом примере MSDN TPL ? В результате я посмотрел на Interlocked
и увидел его параметры Add
, CompareExchange
, Decrement
, Exchange
, Increment
и Read
, но я не просто добавляю, увеличиваю, уменьшаю или проверка на равенство. Я хочу вернуть объект через несколько параллельных потоков, который имеет самое короткое общее расстояние. Моя интуиция говорит, что это должно быть легко, что я должен быть в состоянии создать какой-то маленький объект, охватывающий Location
и расстояние, но как мне получить лучший ответ из каждого потока и , затем выбрать самый короткий расстояние между ними? Вот непараллельная версия:
Location findClosestLocation(Location myLocation, List<Location> allLocations)
{
double closest = double.MaxValue;
Location closestLoc = null;
foreach (Location aLoc in allLocations)
{
if (aLoc != myLocation)
{
double d = greatCircle(myLocation, aLoc);
if (d < closest)
{
closest = d;
closestLoc = aLoc;
}
}
}
return closestLoc;
}
Я действительно увидел пост в блоге DDJ , который, казалось, предлагал хороший совет, но мне было интересно, был ли это лучший совет. Я вижу, как автор перебирает массивы, и задаюсь вопросом, нет ли более функционального способа сделать это. В функциональном мире я бы использовал map
, lambda
и min
.