Параллельный foreach с ConcurrentBag не работает - PullRequest
0 голосов
/ 18 декабря 2018

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

Вот мой код

        var listXls = new List<ReporteXlsPippPrfE>();

        foreach (var records in findItem)
        {

            var item = _plantillaPippBs.GetXlsProformaEpsByCveShcp(records.ftClaveCarteraSHCP);
            if (item != null)
                listXls.Add(item);
        }

        var ConcurrentlistXls = new ConcurrentBag<ReporteXlsPippPrfE>();

        Parallel.ForEach(findItem, records =>
        {
         var item = _plantillaPippBs.GetXlsProformaEpsByCveShcp(records.ftClaveCarteraSHCP);
         if (item != null)
             ConcurrentlistXls.Add(item);

       });

В конце объект ListXls всегда получает 79items и объект ConcurrentlistXls изменяют количество элементов.Я не знаю, что-то упустил.

1 Ответ

0 голосов
/ 18 декабря 2018

Я нашел проблему.Это был не метод GetXlsProformaEpsByCveShcp, который не был потокобезопасным.Чтобы решить эту проблему, я использовал не Parallel.ForEach, а List , затем добавил все задачи и дождался асинхронного завершения всех задач.Я проверил метод (который вызывает базу данных) и увидел, что вызов процедуры находится внутри блока try catch.Когда метод вызывается синхронно, исключение никогда не происходит.Но когда метод выполняется 79 раз в асинхронном режиме, в соединении возникает тайм-аут.Итак, это было решено только путем добавления большего количества времени к свойствам TimeOut объекта SqlCommand.

Наконец, вот как я изменяю свой код

     var asyncBagTask = new List<Task>();
        var ConcurrentlistXls = new ConcurrentBag<ReporteXlsPippPrfE>();

        foreach (var records in findItem)
        {
            asyncBagTask.Add(Task.Run(() =>
            {

                    var item = _plantillaPippBs.GetXlsProformaEpsByCveShcp(records.ftClaveCarteraSHCP);
                    if (item != null)
                    {
                        ConcurrentlistXls.Add(item);
                    }


            }));
        }
      Task.WaitAll(asyncBagTask.ToArray());

Спасибо всем.

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