2014-12-18 2 views
0

Ниже приведен фрагмент кода в моей производственной среде для способа, в котором я использовал Parallel.ForEach и параллельный мешокОдновременный доступ к переменным, несмотря на использование ConcurrentBag

Parallel.ForEach(lstTasks, options, item => 
       { 
        Repository.AssignmentDTO.TaskAssignmentDTO tskVar; 
        while (lstConcurrentObj.TryTake(out tskVar)) 
        { 
         finaltaskslist.Add(ProcessTaskAssgn(item, tskVar));  
        } 

        //} 
       }); 

finaltaskslist список, где я добавлять объекты после выполнения несколько длительных операций в методе ProcessTaskAssgn ....

lstConcurrentObj выше - это параллельный пакет, в который я добавил несколько инициализированных объектов с одинаковыми значениями.

Этот список затем используется для заполнения данных.

Однако, когда я смотрю записи в datatable, ясно, что записи были повторены или смешаны, вывод о том, что мой метод ProcessTaskAssgn не был действительно поточным, а параллельные операции дали неверные результаты. Правильно ли я использую параллельный пакет?

enter image description here

ответ

0

Что вызывает у вас проблема в том, что несколько потоков принимают ту же информацию одновременно

lstConcurrentObj уже заполнены, верно? ConcurrentBag предназначен для сценария Producer-Consumer, где у вас есть одно или несколько потоков чтения и другой поток (ы), записывающий данные в коллекцию. В вашем случае вы просто читаете (потребляете) коллекцию параллельно. Вы можете просто прочитать его параллельно (через Parallel.ForEach, например) и заполнить базу данных в обычном режиме.

Смежные вопросы