Есть несколько способов - какой из них подходит, будет зависеть от вашего сценария.
То, что я делал в Oracle, получало тысячи элементов XML из БД на основе очереди идентификаторов рабочих элементов. Выдача их за один раз с помощью устройства чтения данных не работала, поэтому я вывел их по одному за раз в нескольких разных потоках (каждый поток получал рабочий элемент из очереди до тех пор, пока очередь не опустела). Когда каждый отдельный поток получил результат обратно, он поместил XML в очередь потребителя-производителя, основанную на превосходном учебном пособии Джозефа Албахари . Отдельный поток посмотрел на очередь потребителя-производителя, выполнил XSL-преобразования данных и записал их в файл - конечно же, я тестировал выполнение сначала в однопоточном режиме, и это было значительно медленнее.
Я попытался использовать threadpool / асинхронных делегатов для начала (так как общий совет по созданию потоков - по возможности использовать пул потоков, что делегаты также делают косвенно), что может работать, если у вас не более 64 предметов. WaitHandle.WaitAll
обычно имеет ограничение в 64 рабочих элемента. . Поскольку у меня было 1000 с, это не было хорошим вариантом, кроме как делать их партиями по 64, которые казались грязными.
Из памяти я грациозно выходил из потоков производителя, когда не было больше работы для каждого из них, затем блокировал, пока очередь потребителя производителя также не стала пустой.
Самое главное - убедиться, что у вас есть полностью отдельные объекты БД в каждом потоке, иначе вы столкнетесь с проблемами потоков.
Если вы хотите просто выполнить 1 хранимую процедуру в асинхронном режиме в приложении Windows form / WPF, вам может понадобиться использовать компонент фонового рабочего .
Дайте мне знать, если вам нужна дополнительная информация.