我在ASP.NET應用程序中有一個靜態類,用於存放應用程序範圍的數據處理類,用於管理用戶發送的長時間運行的批量操作。這應該是一個單例對象,因爲它是一個相當重的對象。ASP.NET應用程序變量在線程池中使用後設置爲空
public static class WebGISGlobals
{
private static MultiStatutoryMapPrintProcessor _batchPrintProcessor;
public static MultiStatutoryMapPrintProcessor BatchPrintProcessor
{
get
{
if (_batchPrintProcessor == null)
{
_batchPrintProcessor = new MultiStatutoryMapPrintProcessor(
(string)ConfigurationManager.AppSettings["statPrintWebServiceUrl"], HttpContext.Current.Server.MapPath("~/downloads"));
}
return _batchPrintProcessor;
}
}
}
此處理器級傳遞批量任務的線程池以供執行和所有工作良好....
除外,當隊列變空並處理使用被請求的單身下一次停止WebGISGlobals.BatchPrintProcessor
收集任務結果對象爲空並創建一個新的實例。這不幸的是失去了我對它產生的輸出文件的引用。
我曾嘗試使用Application["BatchProcessor"]
來存儲我的類實例,以供所有人蔘考,但它具有相同的效果。
在我的代碼中沒有地方處理實例或將其設置爲null,所以我卡住了。
任何人都有任何明智的想法。
UPDATE:
從rsbarro我已經運行的線程執行堆棧跟蹤,並沒有表現出任何異常被解僱的建議後。
> WebFGH.DLL!FGH.Global.Application_End(object sender = {System.Web.HttpApplicationFactory}, System.EventArgs e = {System.EventArgs}) Line 167 C#
[Native to Managed Transition]
[Managed to Native Transition]
System.Web.dll!System.Web.HttpApplication.ProcessSpecialRequest(System.Web.HttpContext context = null, System.Reflection.MethodInfo method, int paramCount, object eventSource, System.EventArgs eventArgs, System.Web.SessionState.HttpSessionState session) + 0x110 bytes
System.Web.dll!System.Web.HttpApplicationFactory.FireApplicationOnEnd() + 0x56 bytes
System.Web.dll!System.Web.HttpApplicationFactory.Dispose() + 0x109 bytes
System.Web.dll!System.Web.HttpRuntime.Dispose() + 0x114 bytes
System.Web.dll!System.Web.HttpRuntime.ReleaseResourcesAndUnloadAppDomain(object state) + 0x35 bytes
mscorlib.dll!System.Threading._ThreadPoolWaitCallback.WaitCallback_Context(object state) + 0x2f bytes
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x6f bytes
mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(System.Threading._ThreadPoolWaitCallback tpWaitCallBack) + 0x53 bytes
mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(object state) + 0x59 bytes
[Appdomain Transition]
它不會似乎是一個IIS問題,因爲我得到了相同的使用VS2008 ASP.NET開發服務器。我已經檢查了Application_End,並且一旦這個過程完成,我肯定會觸發(我的zip文件輸出出現,然後事件觸發),所以我猜測線程正在發生什麼事情。我試着......捕捉整個執行方法的內容,但catch沒有被調用。我可以遍歷線程中正在執行的代碼,它似乎不會觸發任何異常。 – MrGFunk
你要把zip文件保存到哪裏?如果您保存到bin目錄將導致應用程序回收。 – rsbarro
我發現了這個問題。你是沿着正確的線rsbarro。在我的線程方法中,我在應用程序根目錄下的一個下載文件夾中創建一個臨時文件夾,以便將來自Web服務的某些文件進行流式處理以壓縮它們。壓縮後,我刪除這個臨時文件夾,這就是它的一切。我只認爲如果我更改了bin或一個asp文件,而不是我創建的隨機目錄或文件,應用程序就會回收。我使用下面的代碼來追蹤錯誤... http://weblogs.asp.net/scottgu/archive/2005/12/14/433194.aspx – MrGFunk