Поскольку ваши операции связаны с вводом-выводом, а не с процессором, лучший способ состоит в том, чтобы иметь 2 потока, один из которых читает из БД записи и помещает его в очередь, другой читает из очереди и генерирует файлы.
В качестве альтернативы, вы можете использовать для этого пул потоков CLR, что-то вроде
while (rdr.Read())
{
string line = rdr.Getring(0);
ThreadPool.QueueUserWorkItem (new WaitCallback(writeData), line);
}
и writeData будет выглядеть как
static void writeData(Object line)
{
string filename = String.Format("file{0}.txt", ++i);
File.WriteAllText(filename, line);
}
Недостатком использования ThreadPool является то, что вы можете создать больше потоков, чем хотите, так как ваши потоки будут блокироваться во время ввода-вывода в большинстве случаев, пул потоков будет создавать новые потоки для обслуживания ваших запросов.
Вы можете сначала попробовать пул потоков и измерить производительность, если вы не удовлетворены, вы можете попробовать подход 2 потоков, 1 очередь; хорошо известна как проблема производителя / потребителя.