2016-12-21 8 views
-2

У меня есть список строк типа с 65000 строк. Мне нужно пройти через всю эту строку и выполнить некоторую задачу. Запуск цикла for итерации 65000 раз занимает больше времени. Поэтому я хотел бы начать от 4 до 5 потоков, которые могут разделить эти данные списка и выполнить индивидуально 10000 - 15000 данных. Я понял, как начать и прервать поток, используя класс Thread. Но я не понимаю, как многопоточное управление потоками и потоками, а также реализует блокирующий маханизм, чтобы несколько потоков не работали на одних и тех же данных, и последовательность выполнения не изменилась.реализация многопоточности для выполнения цикла for в потоках

Я новичок в концепции потоков. Пожалуйста, помогите. Все примеры кода будут оценены.
Спасибо.

+0

[Parallel.For] (https://msdn.microsoft.com/en-us/library/system.threading.tasks .parallel.for (v = vs.110) .aspx) – Jens

+0

Не используйте 'Thread'! Вместо этого используйте 'Task' и дайте инфраструктуре обработать, как обрабатываются задачи в threadpool. Также, если вы просто читаете из списка, вам не понадобится блокировка. – EpicSam

+0

Почему бы не использовать .NET 'Parallel.For' или PLINQ? Зачем писать? –

ответ

3

Я предлагаю PLINQ (Parallel Linq) в качестве первой попытки:

myList 
    .AsParallel() 
    .WithDegreeOfParallelism(4) 
    .ForAll(item => MyRoutine(item)); 

Другой вариант является Parallel.ForEach:

ParallelOptions op = new ParallelOptions() { 
    MaxDegreeOfParallelism = 4, 
    }; 

    Parallel.ForEach(myList, op, item => MyRoutine(item)); 

Edit: будьте осторожны, многие классы не нить сейф, List<T> прилагается (см. комментарии ниже). Если вы хотите, чтобы материализовать данные в список, сделать это с PLINQ:

List<string> listStrings = myList 
    .AsParallel() 
    .WithDegreeOfParallelism(4) 
    .Select(item => item.text.Substring(5, item.text.Length))) 
    .ToList(); // <- this is thread safe 
+0

привет, я устал от вашего первого кода. но он не выполняет все 65000 записей, что дает результат только для 64790 записей, любой ключ? –

+0

@Naveen kumar: у вас есть * исключенные брошенные *? –

+0

исключений не выбрасывается. код выполняется, но результат не является точным –