2

Я буду использовать «Процесс», чтобы ссылаться на работу, которая будет происходить параллельно, и «enqueue», чтобы ссылаться на любой процесс, который будет использоваться для инициирования этого процесса (будь то Task.Run, ThreadPool.QUWI, новый Thread() ... что угодно).Гарантировать немедленный запуск параллельных потоков/задач/независимо

У нас есть программа, чувствительная к производительности, которая порождает несколько параллельных процессов для сбора данных.

У нас возникли проблемы с нерестом, что процессы не начинаются немедленно.

В частности, если мы готовим процесс, запускаем таймер, завершаем процесс и проверяем таймер как самое первое действие в этом процессе ... тогда мы видим, что временная задержка иногда растягивается на 100 или даже 1000 секунд миллисекунды.

Учитывая, что сам процесс должен работать только в течение 3-10 секунд, серьезная проблема связана с задержкой между секундами и активацией процесса за 2 секунды.

= - = - = - = - = - = - = - = - = - = - = - = - = - = - =

В настоящее время наши Реализации начали использовать TP.QUWI, а затем мы переходим к использованию Task.Run. Наше первоначальное исследование ведет нас к стратегии создания темы, используемой Threadpool, и использует ThreadPool.SetMinThreads(), поэтому мы придерживаемся этого угла, чтобы убедиться, что это полностью решит проблему.

Но есть ли другое изменение/подход, на который мы должны обратить внимание, если наша цель состоит в том, чтобы начать процесс после enqueuing?

+0

ли ваше использование приложения' ThreadPool' экстенсивно для других «процессов», которые не чувствительны к времени? Почему так важно для вас? – svick

+0

Я не понимаю вопросы, @svick? Да, мы также используем 'ThreadPool' для некоторых фоновых задач, t в первичном критическом поглаживании hs, но я не вижу актуальности. И, как я уже сказал, программа чувствительна к производительности ... Я не понимаю, почему причины для этого были бы важны? – Brondahl

ответ

1

Taken from here (я настоятельно рекомендую вы прочитанный вверх):

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

You не может предположить, что все параллельные задачи будут немедленно выполняться. В зависимости от текущей рабочей нагрузки и конфигурации системы задачи могут быть запланированы для запуска один за другим или они могут запускаться одновременно. Дополнительные сведения о планировании задач см. В разделе «Планировщик заданий по умолчанию» далее в этой главе.

Создание задач с клиентами Планирование

Вы можете настроить детали того, как задачи в .NET планируется и управляется переопределение задач по умолчанию планировщик в который используется с помощью методов задача фабричных. Например, вы можете предоставить настраиваемый планировщик задач в качестве аргумента для одной из перегруженных версий метода TaskFactory.StartNew.

В некоторых случаях вы можете переопределить планировщик по умолчанию. Наиболее распространенный случай возникает, когда вы хотите, чтобы ваша задача выполнялась в определенном контексте потока ... Другие случаи возникают, когда эвристика балансировки нагрузки планировщика заданий по умолчанию не подходит для вашего приложения. Для получения дополнительной информации см. Раздел «Врезка резьбы» далее в этой главе.

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

Вы можете реализовать свой собственный класс задач планировщика.Для получения дополнительной информации см. Раздел «Написание настраиваемого планировщика заданий» далее в этой главе.

Thread Injection

В .NET пул потоков автоматически управляет число рабочих потоков в бассейне ...

Есть Распознать this SO post "replacing the task scheduler in c sharp with a custom built one "

+0

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

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