int nMaxThreadNum = 5; List<List<JobParam>> jobQueue = new List<List<JobParam>>(); //... for (int i = 0; i < nMaxThreadNum;i++) { ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncDoRetrieve), jobQueue[i]); } static void AsyncDoRetrieve(object state) { if (!(state == null && state is List<JobParam>)) return; List<JobParam> jobParams= state as List<JobParam> ; foreach(JobParam param in jobParams) { param.delegateDoSomeThing.BeginInvoke(param,null,null); } }