ASP.NET应用程序变量在Threadpool中使用后设置为null

时间:2011-07-12 15:18:01

标签: asp.net global-variables threadpool

我的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;
        }
    }

}

此处理器类将批处理任务传递给Threadpool以便执行,并且一切正常....

除了,当队列变空并且下次使用WebGISGlobals.BatchPrintProcessor请求单例来收集任务结果时进程停止,该对象为空并创建一个新实例。遗憾的是,这使我无法参考它产生的输出文件。

我尝试使用Application["BatchProcessor"]存储我的类实例以供所有引用,但它具有相同的效果。

我的代码中没有任何地方可以处理实例或将其设置为null,因此我被卡住了。

任何人都有任何好主意。

更新:

在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]  

1 个答案:

答案 0 :(得分:0)

如果代码中没有任何内容使_batchPrintProcessor无效,那么您所看到的行为的可能原因是IIS正在关闭(或重新启动)您的ASP.NET应用程序。默认情况下,如果没有活动,IIS 7.5中的应用程序池将每20分钟关闭一次。您的应用程序也将由ASP.NET / IIS重新启动,原因有很多,包括bin目录的更改,生成的线程上未处理的异常等。

要检查这是否是问题,只需在Global.asax中的Application_StartApplication_End事件中添加一些日志记录代码。

另见: What causes an application pool in IIS to recycle?