Я плохо знаком с C#, Parallel.ForEach
, и.NET в целом. Я хочу параллелизировать поиск, который включает тысячи местоположений. Для каждого местоположения я вычисляю большое круговое расстояние. Это - вычисление, которое я хочу распространить к различным ядрам. Мой вопрос состоит в том, как я делаю это, если у меня только есть одна локальная переменная потока, как в этом примере TPL MSDN? Для результата я смотрел на Interlocked
, и видел его опции Add
, CompareExchange
, Decrement
, Exchange
, Increment
и Read
, но я только добавляю, постепенное увеличение, постепенное уменьшение или тестирование на равенство. Я хочу возвратить объект по нескольким потокам, работающим параллельно, который имеет самое короткое общее расстояние. Мой пищеварительный тракт говорит, что это должно быть легко, что я должен смочь создать некоторый небольшой объект, который переносит a Location
и расстояние, но как я получаю лучший ответ от каждого потока и затем выбираю кратчайшее расстояние среди них? Вот непараллельная версия:
Location findClosestLocation(Location myLocation, List 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
.