1
如何查找線程池中線程的60%(或N%)可用性? 這背後的邏輯是什麼?
父線程使用線程池線程產生多個URL並等待所有子線程完成。線程池中線程的可用性?
代碼如下:
父線程
public void Save()
{
List<Job> Jobs = PickJobs();
int workerThreads = 0,compThreads = 0;
ThreadPool.GetMinThreads(workerThreads, compThreads);
int requiredThreads = 15;
ThreadPool.SetMaxThreads(requiredThreads, compThreads);
WaitCallback waitCallBack = default(WaitCallback);
ManualResetEvent mEvent = default(ManualResetEvent);
foreach (Job _job in Jobs)
{
waitCallBack = new WaitCallback(CallBackFunc);
mEvent = new ManualResetEvent(false);
events.Add(mEvent);
ThreadPool.QueueUserWorkItem(waitCallBack, new UrlData(_job, mEvent, HttpContext.Current));
}
WaitHandle.WaitAll(events.ToArray(), 300000);//05 Minutes
}
子線程跨線程
public class UrlData
{
public Job job;
public ManualResetEvent FinishEvent;
public HttpContext HttpContextRef;
public UrlData(Job pJob, ManualResetEvent pEvent, HttpContext pContext)
{
job= pJob;
FinishEvent = pEvent;
HttpContextRef = pContext;
}
}
在上述c表示通信
private void CallBackFunc(object obj)
{
UrlData msgObj = (UrlData)obj;
WebRequest lWebRequest = WebRequest.Create(psUrl);
lWebRequest.Timeout = 60000;
WebResponse lWebResponse = lWebRequest.GetResponse;
msgObj.FinishEvent.Set();
}
對象數據所需的線程被硬編碼爲:
int requiredThreads = 15;
ThreadPool.SetMaxThreads(requiredThreads, compThreads);
這個硬編碼是否會導致線程池不足?如果線程池中沒有線程可用,會發生什麼情況? 如何查找託管服務器中線程池中可用的線程總數?
謝謝。
爲什麼你擔心線程池中可用的線程?讓實現擔心這一點,並使用線程池。 – 2013-03-22 11:24:44
線程池中可用線程的總數當然是一個數字,當你獲得它時,以及在你對這個數字採取任何行動之前,這個數字就可以立即出錯。 – 2013-03-22 11:37:04
@Tony獅子:因爲requiredThreads是硬編碼的,並且線程池線程是共享線程,並且可以被其他應用程序拾取。 – Sunil 2013-03-22 11:42:37