Выбор минимума среди минимумов с помощью Параллели. ForEach

Я плохо знаком с 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.

6
задан gknauth 23 July 2010 в 22:17
поделиться