Parallel.ForEach и общая безопасная коллекция! - PullRequest
1 голос
/ 21 июня 2011

Я не могу понять, почему мой следующий код не работает должным образом. Это упрощенная версия этого

public class TheClass
{
    protected void SomeMethod(List<string> works)
    {
         ConcurrentBag<MyResult> mySafeCollection= new ConcurrentBag<MyResult>();

         Parallel.ForEach(works, work=>
            { 
                   mySafeCollection.Add(GetResult(work));

            }
    }

    private MyResult GetResult(string work)
    {
        ResultClass result = new ResultClass ();
        result.Id = "some text";
        //Some work here to set result.Value
        return result;
     }
}

Как видно, у меня есть класс, который получает список строк, работает, а затем вызывает некоторый локальный метод, который выполняет некоторую работу и возвращает объект результата. Я ожидаю, что количество элементов в mySafeCollection всегда будет таким же, как работы, и также ни один из элементов в mySafeCollection никогда не будет нулевым, поскольку я возвращаю новый экземпляр объекта результата для каждого вызова, но это не так !!! Иногда в mySafeCollection отсутствует элемент или один из его элементов имеет значение null, что означает, что GetResult вернул значение null. Это не имеет смысла! Результат создается для каждого вызова метода GetResult. Сначала я думал, что это из-за коллекции mySafeCollection, в которой она была списком, проблема связана с ошибками в методе List.Add, но даже переключение на ConcurrentBag не решило проблему. Любая подсказка?

1 Ответ

0 голосов
/ 21 июня 2011

Я предполагаю, что это состояние гонки.Одна из перегрузок для Parallel.ForEach - это

Action<TLocal> localFinally

Если вы используете это действие, чтобы поймать finally, оно должно, помимо прочего, дать вам возможность ответить в тот момент, когда вы все еще можете что-то сделатьоб этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...