在ASP.NET Web应用程序中,工作线程创建一个非线程池线程,如下所示:
private static bool _refreshInProcess = false; public delegate void Refresher(); private static Thread _refresher; private static void CreateAndStartRefreshThread(Refresher refresh) { _refresher = new Thread(new ThreadStart(refresh)); _refresher.Start(); } private static void Refresh() { LoadAllSystemData(); } static public void CheckStatus() { DateTime timeStamp = DateTime.Now; TimeSpan span = timeStamp.Subtract(_cacheTimeStamp); if (span.Hours >= 24) { if (Monitor.TryEnter(_cacheLock)) { try { if (!_refreshInProcess) { _refreshInProcess = true; CreateAndStartRefreshThread(Refresh); } } finally { Monitor.Exit(_cacheLock); } } } } static public void LoadAllSystemData() { try { if (!Database.Connected) { if (!OpenDatabase()) throw new Exception("Unable to (re)connect to database"); } SystemData newData = new SystemData(); LoadTables(ref newData); LoadClasses(ref newData); LoadAllSysDescrs(ref newData); _allData = newData; _cacheTimeStamp = DateTime.Now; // only place where timestamp is updtd } finally { _refreshInProcess = false; } }
和LoadAllSystemData也在与CheckStatus相同的锁定保护部分的其他地方调用。这两个调用都在他们的try-bolcks中,也有catch-block。
现在我的问题是 1.如果LoadAllSystemData抛出异常,当在方法Refresh中从非线程池线程调用它时,会发生什么?没有人能抓住它。
完成1000次后会发生什么?这些异常是否存储在某个地方,从而给系统带来压力,并最终因内存耗尽而崩溃?
有没有很好的解决方案来捕获它们而无需在创建线程池线程中等待创建的线程完成?
非常感谢! -Matti
答案 0 :(得分:1)