Существует ли стандартный шаблон, позволяющий избежать задержки в очереди заданий из-за одной заблокированной задачи? - PullRequest
1 голос
/ 07 сентября 2010

У меня есть базовая очередь выполнения задач (c # WinForms App, которая общается с 3 отдельными системами).Все замечательно, пока один из веб-сервисов не решит не отвечать с обычной скоростью.

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

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

Дополнения на основе комментариев / ответов

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

Мое предположение состоит в том, что время от времени вызов веб-службы непропорционально дольше завершается, хотя его все же считают исключительным.Это оказывает NON (исправленное) незначительное влияние на общее время выполнения, скажем, N заданий, если среднее время выполнения составляет 1 секунду (включая множество разрозненных вызовов веб-службы) и 0,0001% времени, которое веб-служба занимает15 секунд на ответ.

Является ли пул потоков еще одним способом сказать: «раскрутить рабочие потоки и управлять их состоянием вручную»?Или есть что-то, что может помочь мне справиться со сложностью?Я беспокоюсь о том, что вероятность появления ошибки (й) растет пропорционально преимуществам в этом случае ...

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

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

Причина, по которой я этого не сделалКомпонент BackgroundWorker используется потому, что, похоже, он создан для случая, когда вы знаете, сколько рабочих вам нужно, и я бы в идеале оставил дизайн гибким

PS: Еще раз спасибо.Спасибо!

Ответы [ 4 ]

3 голосов
/ 07 сентября 2010

Это зависит от того, насколько важен порядок элементов очереди и насколько важно, чтобы элемент был завершен до обработки следующего. Если один предмет должен быть полностью обработан до следующего, то в основном вы застряли. Если нет, вы можете решить реализовать простой пул рабочих потоков. если вариант .NET 4.0, я бы порекомендовал использовать для этого Parallel Extensions и особенно методы AsParallel () и AsOrdered ().

1 голос
/ 07 сентября 2010

Для этого лучше всего подходит шаблон производитель-потребитель, и хорошим подходом является использование очереди (либо Queue<T>, заключенной в lock, либо новой ConcurrentQueue<T>). Это также дает вам возможность перерабатывать запросы веб-служб, которые не выполняются из-за тайм-аутов или обрывов соединений.

Если вы хотите использовать более двух максимальных значений по умолчанию для двух одновременных веб-подключений, добавьте это в файл app.config (замените «10» на новый максимум):

<configuration>
  <system.net>
    <connectionManagement>
      <add address="*" maxconnection="10"/>
    </connectionManagement>
  </system.net>
</configuration>
1 голос
/ 07 сентября 2010

Похоже, что вы можете искать здесь, это фоновый работник. Класс, который аккуратно инкапсулирует запуск рабочего потока, отслеживание прогресса и получение результатов. http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx. Быстро и просто использовать, просто подключите события DoWork, ProgressChanged и RunWorkerCompleted и затем запустите его.

0 голосов
/ 22 декабря 2010

Если вы используете .Net 4, вы также можете взглянуть на Задачи

...