Реализация многопоточности в C# (кодируют обзор),

Код ниже тестируется на моем локальном хосте. Я использовал JQuery.

HTML

    
        
        
        
        
        
        Document
    

    


        
        
    

    

Таблица стилей-2

    .no-image {
        color:yellow;
        background-image: none;
    }

Таблица стилей

    .b{
        background-color: blue;
    }

    .a{
        background-color: #000;
    }


    .test{
        background-color: red;
        width: 100px;
        height: 50px;
    }

И я получил файл console.log о том, какая таблица стилей и какой класс.

Спасибо.

enter image description here

6
задан core 28 September 2008 в 01:57
поделиться

7 ответов

Пул потоков является удобным выбором, если у Вас есть легкий вес спорадическая обработка, которая не время чувствительная. Однако я вспоминаю чтение на MSDN, что это не подходит для крупномасштабной обработки этой природы.

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

Мой любимый шаблон в модели рабочего потока должен создать основной поток, который содержит очередь объектов задач. Затем разветвите набор рабочих, которые выталкивают объекты от той очереди для обработки. Я использую блокирующуюся очередь так, чтобы, когда нет никаких объектов процесса, рабочие просто блок, пока что-то не продвинуто на очередь. В этой модели основной поток производит объекты работы из некоторого источника (дб, и т.д.), и рабочие потоки используют их.

4
ответ дан 10 December 2019 в 02:55
поделиться

Я второй идея использовать блокирующуюся очередь и рабочие потоки. Вот блокирующаяся реализация очереди, которую я использовал в прошлом с хорошими результатами: http://www.codeproject.com/KB/recipes/boundedblockingqueue.aspx

Что вовлечено в Вашу логику проверки? Если бы его главным образом Зависящее от ЦП затем я создал бы не больше, чем 1 рабочий поток на процессор/ядро на поле. Это скажет Вам количество процессоров: Environment.ProcessorCount

Если Ваша проверка включает ввод-вывод, такой как Доступ к файлу или доступ к базе данных затем, Вы могли бы использовать еще несколько потоков, чем количество процессоров.

2
ответ дан 10 December 2019 в 02:55
поделиться

Будьте осторожны, QueueUserWorkItem мог бы перестать работать

1
ответ дан 10 December 2019 в 02:55
поделиться

ThreadPool не может быть оптимальным для затора так сразу в него. Можно хотеть исследовать верхние пределы его возможностей и/или самокрутки.

Кроме того, существует состояние состязания, которое существует в Вашем коде, если Вы не ожидаете дублирующихся проверок. Вызов к

this.validatingItems.Add(itemId);

потребности произойти в основном потоке (ValidateItem), не в потоке пула потоков (Проверяют метод). Этот вызов должен произойти строка перед организацией очередей объекта работы к пулу.

Худшая ошибка найдена, не проверив возврат QueueUserWorkItem. Организация очередей может перестать работать, и почему она не выдает исключение, тайна нам всем. Если это возвращает false, необходимо удалить объект, который был добавлен к списку validatingItems, и обработайте ошибку (бросьте exeception, вероятно).

1
ответ дан 10 December 2019 в 02:55
поделиться

Я был бы обеспокоен производительностью здесь. Вы указали, что база данных может дать его, 20-30 объектов в секунду и объект могли занять несколько секунд, которые будут проверены. Это могло быть настоящим большим количеством потоков - использование Ваших метрик, худший случай 60-90 потоков! Я думаю, что необходимо пересмотреть дизайн здесь. Michael упомянул хороший шаблон. Использование очереди действительно помогает держать вещи под контролем и организованный. Семафор мог также использоваться к контрольному числу созданных потоков - т.е. у Вас могло быть максимальное количество позволенных потоков, но при меньших загрузках, необходимо будет не обязательно создать максимальное количество, если бы меньше закончили тем, что получили сделанное задание - т.е. собственный размер пула мог бы быть динамичным с ограничением.

При использовании пула потоков я также нахожу более трудным контролировать выполнение потоков от пула в их выполнении работы. Так, если это не огонь, и забудьте, я выступаю за более управляемое выполнение. Я знаю, что Вы упомянули, что Ваши выходы приложения после 65K объектов все завершаются. Как Вы контролируете, Вы распараллеливаете, чтобы определить, завершили ли они свою работу - т.е. все рабочие с очередями сделаны. Вы контролируете состояние всех объектов в HashSets? Я думаю путем организации очередей объектов, и наличие собственных рабочих потоков использует от той очереди, можно получить больше контроля. Хотя, это может прибыть за счет больше служебного с точки зрения передачи сигналов между потоками для указания, когда все объекты были поставлены в очередь, позволив им выйти.

0
ответ дан 10 December 2019 в 02:55
поделиться

Вы могли также попытаться использовать CCR - Время выполнения Координации и Параллелизм. Это проложило под землей в Microsoft Robotics Studio, но обеспечивает превосходный API для того, чтобы сделать этот вид вещи.

Необходимо было бы просто создать "Порт" (по существу очередь), поднять трубку получатель (метод, который называют, когда что-то отправляется на него), и затем отправьте объекты работы на него. CCR обрабатывает очередь и рабочий поток для работы его.

Вот видео на Channel9 о CCR.

Это очень высокоэффективно и даже используется для материала неробототехники (Myspace.com использует его позади scenese для их сети доставки контента).

0
ответ дан 10 December 2019 в 02:55
поделиться

Существует возможная логическая ошибка в коде, отправленном с вопросом, в зависимости от где идентификатор объекта в ValidateItem(int id) прибывает из. Почему? Поскольку, хотя Вы правильно блокируете свой validatingItems и validatedItems очереди перед организацией очередей объект работы, Вы не добавляете объект к validatingItems очереди до вращений нового потока. Это означает, что мог быть разрыв времени, где другой поток звонит ValidateItem(id) с тем же идентификатором (если это не работает на единственном основном потоке).

Я добавил бы объект к validatingItems очереди прежде, чем поставить объект в очередь в блокировке.

Править: также QueueUserWorkItem() возвращает bool, таким образом, необходимо использовать возвращаемое значение, чтобы удостовериться, что объект был поставлен в очередь, и ЗАТЕМ добавьте его к validatingItems очереди.

1
ответ дан 10 December 2019 в 02:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: