線程池線程在進程未結束時,做爲後臺線程,它不會結束執行。但在前臺進程結束後,沒有執行完成的線程池對象就不會再執行了。因此做爲web應用程序,使用線程池線程可能增加性能。但要考慮如果進程結束了。程序是否會被terminate的問題。
首先做了在應用程序池的測試。使用iis新建了一個網站。然後打開頁面。用ajax去調用方法。然後迅速關閉該頁面。ajax的方法如下:
private void ThreadPoolTest()
{
/*測試目的是當頁面關閉後,在線程池中的程序是不是仍可能運行*/
logger.Debug("this is a test!");
commResponse.IsSuccess = true;
commResponse.Msg = "返回數據成功";
ThreadPool.QueueUserWorkItem((obj) => {
logger.Debug("threadPool is start ....");
Thread.Sleep(1000 * 30);
logger.Debug("threadPool is end!");
});
ReturnJson(commResponse);
}
測試結果如下:由此可以在部署後的web應用程序中這個進程池一直在運行的,所以它沒有被結束掉。
2018-09-08 22:33:27,916 [9] DEBUG WebDemo.Ajax.ComsumerAjax - this is a test!
2018-09-08 22:33:27,937 [8] DEBUG WebDemo.Ajax.ComsumerAjax - threadPool is start ....
2018-09-08 22:33:57,937 [8] DEBUG WebDemo.Ajax.ComsumerAjax - threadPool is end!
接下來,思考如果使用VS中的服務啓動,ajax後迅速結束服務。會出現什麼情況呢?
private void ThreadPoolTest()
{
/*測試目的是當頁面關閉後,在線程池中的程序是不是仍可能運行*/
logger.Debug("this is debug mode's test!");
commResponse.IsSuccess = true;
commResponse.Msg = "返回數據成功";
ThreadPool.QueueUserWorkItem((obj) => {
logger.Debug("threadPool is start ....");
Thread.Sleep(1000 * 30);
logger.Debug("threadPool is end!");
});
ReturnJson(commResponse);
}
結果如下:
2018-09-08 22:33:27,916 [9] DEBUG WebDemo.Ajax.ComsumerAjax - this is a test!
2018-09-08 22:33:27,937 [8] DEBUG WebDemo.Ajax.ComsumerAjax - threadPool is start ....
2018-09-08 22:33:57,937 [8] DEBUG WebDemo.Ajax.ComsumerAjax - threadPool is end!
2018-09-08 22:36:57,588 [7] DEBUG WebDemo.Ajax.ComsumerAjax - this is debug mode's test!
2018-09-08 22:36:57,595 [6] DEBUG WebDemo.Ajax.ComsumerAjax - threadPool is start ....
結論:
在IIS環境下部署的web應用,因爲進程在持續的進行的,所以可以放心地使用線程池來處理一些簡短的任務。下一篇中我們繼續探討在windows服務中,是不是也可以安全地使用線程池來完成任務呢?