2011-07-12 6 views
1

ユーザーが送信した長期実行中のバッチ操作を管理するために使用するアプリケーションワイドデータ処理クラスを保持するために使用するASP.NETアプリケーションに静的クラスがあります。それはかなり重いオブジェクトであるため、これはシングルトンオブジェクトでなければなりません。キューが空になると、プロセスはシングルトンを使用して要求され、次回を停止ASP.NETアプリケーション変数は、スレッドプールで使用された後にnullに設定されます

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タスク結果を収集するには、オブジェクトはnullであり、新しいインスタンスを作成します。これは残念なことに、私が生成する出力ファイルへの参照を失います。

私は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分ごとにシャットダウンされます。また、binディレクトリの変更、生成されたスレッドの処理されない例外など、ASP.NET/IISによってアプリケーションが再起動されます。

これが問題かどうかを確認するには、あなたのGlobal.asaxのApplication_StartApplication_Endのイベントへ

も参照してください:私がそれを用いVS2008 ASP.NETのDevサーバーを取得していますとIISの問題であることを表示されません What causes an application pool in IIS to recycle?

+0

。私はApplication_Endをチェックして、プロセスが完了すると(私のzipファイルの出力が現れ、その後イベントが発生した)、スレッドが何かが起こっていると推測している間に、私は試して...全体のメソッドメソッドの内容をキャッチがキャッチは呼び出されません。スレッドで実行されているコードをステップ実行することができ、例外をトリガするようには見えません。 – MrGFunk

+0

Zipファイルをどこに保存していますか? binディレクトリに保存している場合は、アプリがリサイクルされます。 – rsbarro

+1

私は問題を発見しました。あなたは正しい線rsbarroに沿っていた。私のスレッドメソッドでは、アプリケーションルートディレクトリのダウンロードフォルダに一時フォルダを作成して、それらを圧縮するためにWebサービスからのいくつかのファイルをストリームします。彼らが圧縮された後、私はこの一時フォルダを削除し、それがすべて落ちる場所です。私は、私がbinやaspファイルの1つを変更した場合、私が作成したランダムなディレクトリやファイルではなく、アプリケーションがリサイクルすると思っていました。次のページのコードを使用してエラーを追跡しました... http://weblogs.asp.net/scottgu/archive/2005/12/14/433194.aspx – MrGFunk

関連する問題