Если вы описываете, по сути, пакетный процесс, вполне нормально иметь таймер, который работает с интервалом - большая часть мира работает таким образом.
Если он длится долго, постарайтесь сделать так, чтобы ваши единицы работы или партии были настолько малы, чтобы ваш процесс мог хотя бы проверить, было ли сигнализировано о его остановке или нет. Это позволит службе корректно завершить работу, а не игнорировать сообщение об остановке службы.
Где-то в вашей функции таймера у вас есть свойство IsShutdownRequired или что-то подобное, что вы проверяете (при условии некоторой обработки цикла). Это свойство имеет значение true в сообщении управления остановкой службы, которое позволяет вашему процессу корректно завершиться, либо не пытаясь выполнить больше работы, либо, как предложил Джимми, откатывая эту работу, если она находится в транзакции.
В идеале, меньшие партии были бы лучше, чем одна большая.