2013-03-22 103 views
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); 

這個硬編碼是否會導致線程池不足?如果線程池中沒有線程可用,會發生什麼情況? 如何查找託管服務器中線程池中可用的線程總數?

謝謝。

+1

爲什麼你擔心線程池中可用的線程?讓實現擔心這一點,並使用線程池。 – 2013-03-22 11:24:44

+3

線程池中可用線程的總數當然是一個數字,當你獲得它時,以及在你對這個數字採取任何行動之前,這個數字就可以立即出錯。 – 2013-03-22 11:37:04

+1

@Tony獅子:因爲requiredThreads是硬編碼的,並且線程池線程是共享線程,並且可以被其他應用程序拾取。 – Sunil 2013-03-22 11:42:37

回答

0

經過一番研究,我得到了最大線程數檢索功能。
它返回一段時間內線程池中可用的線程數。如果發生線程匱乏,它將返回零。

/// <returns>int (Number of threads currently available)</returns> 
private int GetMaxItemsRetrievalCount() 
{ 
int rtnVal = 1; 
try { 
    //Get Available idle threads currently in the thead pool. 
    ThreadPool.GetAvailableThreads(workerThreads, completionThreads); 

    rtnVal = workerThreads > MaxConcurrentThreads ? MaxConcurrentThreads : workerThreads; 
    //Math.Min(MaxConcurrentThreads - currentWorkLength, workerThreads - ThreadBuffer); 

    rtnVal = rtnVal > 0 ? rtnVal : 0; 
} catch (Exception ex) { 
    WriteTransactionalJobLog(new JobLogDTO { 
     Mode = "Parallel", 
     UniqueId = "GetMaxItemsRetrievalCount Exception", 
     ThreadId = Thread.CurrentThread.ManagedThreadId.ToString(), 
     StartTime = DateTime.Now.ToString(), 
     ExceptionOrResult = ex.ToString() 
    }); 
} 

return rtnVal; 
}