スレッドプールからスレッドの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
}
子スレッド
private void CallBackFunc(object obj)
{
UrlData msgObj = (UrlData)obj;
WebRequest lWebRequest = WebRequest.Create(psUrl);
lWebRequest.Timeout = 60000;
WebResponse lWebResponse = lWebRequest.GetResponse;
msgObj.FinishEvent.Set();
}
スレッド間の通信用のオブジェクトデータ
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;
}
}
上記のコードでは、必要なスレッドは次のようにハードコードされています。
int requiredThreads = 15;
ThreadPool.SetMaxThreads(requiredThreads, compThreads);
このハードコーディングはスレッドプールの枯渇につながりますか?そして、スレッドプールで利用可能なスレッドがない場合はどうなりますか?ホスティングサーバーのスレッドプールで利用可能なスレッドの総数を見つける方法は?
ありがとう。