C # Консольное приложение Threading? - PullRequest
3 голосов
/ 23 сентября 2010

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

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

Я собираюсь создать консольное приложение C # и использовать планировщик Windows для его запуска.1006 * Мои вопросы:

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

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

Ответы [ 4 ]

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

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

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

0 голосов
/ 24 июля 2013

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

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

0 голосов
/ 01 октября 2010

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

0 голосов
/ 01 октября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...