我的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]
答案 0 :(得分:0)
如果代码中没有任何内容使_batchPrintProcessor
无效,那么您所看到的行为的可能原因是IIS正在关闭(或重新启动)您的ASP.NET应用程序。默认情况下,如果没有活动,IIS 7.5中的应用程序池将每20分钟关闭一次。您的应用程序也将由ASP.NET / IIS重新启动,原因有很多,包括bin目录的更改,生成的线程上未处理的异常等。
要检查这是否是问题,只需在Global.asax中的Application_Start
和Application_End
事件中添加一些日志记录代码。