public void DoWork() { ThreadPool.SetMinThreads(ThreadCount, ThreadCount); List <ManualResetEvent> manualResetEvents = new List <ManualResetEvent>(); foreach (var a in DicAllServerGroup) { if (Convert.ToBoolean(a.Value.TrueFalse) && a.Key.GroupName.Equals(SelectedServerGroup, StringComparison.OrdinalIgnoreCase)) { ThreadPoolStatus threadPoolStatus = new ThreadPoolStatus(); threadPoolStatus.signal = new ManualResetEvent(false); threadPoolStatus.stop = manualResetEvent; manualResetEvents.Add(threadPoolStatus.signal); MainWorker mainWorker = new MainWorker(ThreadCompletedAndExecuteMethod , a.Key.Ip , a.Key.Port , UserId , Password , a.Key.Database , ConnectionTimeoutSec , CommamdTimeoutSec , Querys , ColumnDelimiter ); mainWorkerList.Add(mainWorker); ThreadPool.QueueUserWorkItem(mainWorker.DoWork, threadPoolStatus); } } DateTime endTime = DateTime.Now.Add(new TimeSpan(0, 0, ThinkTimeSec)); while (DateTime.Now < endTime) { if (CancelRequested) { break; } Thread.Sleep(100); } if (!CancelRequested) { // 동시에 시작~ 고~ manualResetEvent.Set(); WaitForAll(manualResetEvents); } PoolWorkerCompleteCallbackMethodName(); }
public void DoWork(object theadPoolStatus) { bool bReturn = false; ThreadPoolStatus status = theadPoolStatus as ThreadPoolStatus; if (status == null) { return; } Debug.WriteLine("WorkQueue Ready!"); // 한번에 실행하려고 status.stop.WaitOne(); // 실행 bReturn = QueryExecuter(Querys, CommandTimeoutSec); // 콜백 CallbackMethodName(Ip, Port, Catalog, bReturn, ErrorCnt, sbResultAll); // 완료 시그널 다음 Thread 고~ status.signal.Set(); }