Возвращаемое значение и ключевое слово внутри цикла Parallel ForEach или For

Каков правильный способ вернуть значение из цикла Parallel ForEach или For?

Например, правильный / потокобезопасный следующий код?

{
    Process[] processes = Process.GetProcesses();
    String ProcessName = String.Empty;
    Parallel.ForEach(processes, curItem => {
        if (curItem.Handle == this._handle) {
            ProcessName = curItem.ProcessName;
            return;
        }
    });
    return ProcessName;
}

ИЛИ ЭТО?

{
    Process[] processes = Process.GetProcesses();
    List<String> ProcessNames = new List<String>();
    Parallel.ForEach(processes, curItem => {
            ProcessNames.Add(processes.ProcessName);
        }
    });
    return ProcessNames;
}

И, наконец, какой поведение ключевого слова return внутри цикла Parallel For или ForEach?

IE: Он немедленно завершает все потоки? Не вызовет ли это каких-либо артефактов, которых вы не ожидали?

Надеюсь, то, что я спрашиваю, имеет смысл.

PS: Чтобы быть более конкретным. В первом примере моя модификация String threadsafe содержит значение, которое я ожидаю из-за оператора return? А во втором примере - безопасна ли моя модификация List Collection? Будут ли добавлены все ожидаемые значения?

7
задан Maxim Gershkovich 29 March 2011 в 14:11
поделиться