2010-09-23 3 views
3

Я собираюсь написать консольное приложение, которое будет запускаться раз в неделю в 2 часа ночи в воскресенье утром. Он собирается опросить базу данных SQL-сервера, затем выполнить некоторые вычисления и затем записать результаты в новую базу данных.C# Console App Threading?

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

Я собираюсь создать консольное приложение C# и использовать планировщик окон, чтобы запустить его.

Мои вопросы:

1) Как вы думаете, это хороший подход взять? 2) В прошлом аналогичные консольные приложения поставили процессор на 100%, пока он непрерывно петли. Есть ли хороший способ правильно обрабатывать потоки и т. Д.?

Любой совет, прежде чем я начну, будет очень благодарен.

T

ответ

1

В целом, это хороший подход, поскольку она планирует CPU & интенсивный процесс данных на непиковых/выключение рабочих часов, так что опыт пользователя и доступность приложений не будет уменьшен. Учитывалось бы только то, сколько времени может потребоваться вашему рабочему процессу? Если он будет работать через 30-40 часов, это может повлиять на рабочие часы в понедельник.

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

+0

Спасибо, я ценю ваши отзывы. –

0

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

Что касается многопоточности, это зависит от вашей ситуации. Если у вас есть несколько ядер/процессоров, и если вы можете разделить проблему на параллельные задачи, вы можете использовать более 1 потока. В то же время, если у вас есть несколько ядер/процессоров, чтобы избавиться, вы также имеете меньший риск взломать весь процессор с помощью однопоточного приложения, поскольку другие процессы просто перенаправляются для использования других ядер/процессоров.

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

0

Вы можете посмотреть классы Tasks.Parallel (больше информации here). Недавно я реализовал нечто похожее и столкнулся с теми же проблемами. К счастью для меня, его выделенный сервер для обработки этого ...

0

Если ваш процессор находится на 100%, вы должны использовать пейджинг и пакетную обработку, чтобы минимизировать работу, выполняемую вашим приложением в каждом цикле. Например, вместо того, чтобы извлекать все записи из БД, извлекать первый миллион, обрабатывать его, а затем извлекать следующий миллион и т. Д.

Если один поток потребляет все циклы ЦП, создание нескольких потоков будет только добавьте служебные данные.