se io dovessi prendere N elementi per ogni elemento richiedere N dati e attendere N secondi per poi insierirli dentro ad un db la cosa che mi viene da pensare che per non prendere il 100% della CPU debba utizzare i thread.

vedendo il link
ThreadPool

mi viene da pensare a questo:

codice:
for(int i=0; i<N;i++)
{
   PrendiDati(v[i]);
}

void PrendiDati(object dato)
{
   ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc), dato);
}

static void ThreadProc(Object stateInfo) 
{
  qui richiedo i dati e poi li inserisco nel db        
}
Praticamente è come se il thread finisse prima della funzione ThreadProc.