ユーザーが送信した長期実行中のバッチ操作を管理するために使用するアプリケーションワイドデータ処理クラスを保持するために使用する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]
。私はApplication_Endをチェックして、プロセスが完了すると(私のzipファイルの出力が現れ、その後イベントが発生した)、スレッドが何かが起こっていると推測している間に、私は試して...全体のメソッドメソッドの内容をキャッチがキャッチは呼び出されません。スレッドで実行されているコードをステップ実行することができ、例外をトリガするようには見えません。 – MrGFunk
Zipファイルをどこに保存していますか? binディレクトリに保存している場合は、アプリがリサイクルされます。 – rsbarro
私は問題を発見しました。あなたは正しい線rsbarroに沿っていた。私のスレッドメソッドでは、アプリケーションルートディレクトリのダウンロードフォルダに一時フォルダを作成して、それらを圧縮するためにWebサービスからのいくつかのファイルをストリームします。彼らが圧縮された後、私はこの一時フォルダを削除し、それがすべて落ちる場所です。私は、私がbinやaspファイルの1つを変更した場合、私が作成したランダムなディレクトリやファイルではなく、アプリケーションがリサイクルすると思っていました。次のページのコードを使用してエラーを追跡しました... http://weblogs.asp.net/scottgu/archive/2005/12/14/433194.aspx – MrGFunk