2011-07-12 22 views
1

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

回答

0

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

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

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

+0

它不会似乎是一个IIS问题,因为我得到了相同的使用VS2008 ASP.NET开发服务器。我已经检查了Application_End,并且一旦这个过程完成,我肯定会触发(我的zip文件输出出现,然后事件触发),所以我猜测线程正在发生什么事情。我试着......捕捉整个执行方法的内容,但catch没有被调用。我可以遍历线程中正在执行的代码,它似乎不会触发任何异常。 – MrGFunk

+0

你要把zip文件保存到哪里?如果您保存到bin目录将导致应用程序回收。 – rsbarro

+1

我发现了这个问题。你是沿着正确的线rsbarro。在我的线程方法中,我在应用程序根目录下的一个下载文件夹中创建一个临时文件夹,以便将来自Web服务的某些文件进行流式处理以压缩它们。压缩后,我删除这个临时文件夹,这就是它的一切。我只认为如果我更改了bin或一个asp文件,而不是我创建的随机目录或文件,应用程序就会回收。我使用下面的代码来追踪错误... http://weblogs.asp.net/scottgu/archive/2005/12/14/433194.aspx – MrGFunk

相关问题