Предложу свой вариант с учетом тех вариантов, что предложили Вы.
Но начну с замечаний по поводу потоков: был у меня проект, где на каждый чих создавался поток, в итоге никакой сервер не справлялся с нагрузкой — просто не хватало оперативной памяти. Как мне помнится, каждый поток отжирал 8 МБ.
Из этого опыта я вижу картинку следующим образом:
Каждый айтем надо класть в очередь, из которой брать и отправлять в одном или несколькими потоках, в зависимости от ситуации (настроек скажем App.config).
При успешном отправлении записывать в БД сразу пачкой.
Из всего этого следует, что нужно продумать очередь отправки с пулом потоков (а может даже и одного потока хватит), и разбитие очереди на пачки.
Выгода:
1) Разбиение на пачки снижает нагрузку на SQL сервер.
2) На каждый айтем из очереди не создается отдельного потока, что экономит оперативную память.
Использовал бы я как раз WinService, дописав к ней консоль, позволяющая настраивать очередь, количество потоков, и прочее, что понадобится.
Надеюсь помог, удачи!