0

.net 4.5 RC で新しい async/await パラダイムを使用している Asp .Net アプリケーションがあります。HttpTaskAsyncHandlerhttp 要求を処理するために、新しいタスクベースの非同期 http ハンドラーを使用しています。私のコードでは、ファイルをクライアントにストリーミングする I/O を行っています。

時々NullPointerException、次のスタック トレースが表示されます。

System.Web.dll!System.Web.HttpApplication.CurrentModuleContainer.get() + 0x1e バイト System.Web.dll!System.Web.HttpApplication.PipelineStepManager.ResumeSteps(System.Exception エラー) + 0xb7 バイト
System.Web.dll! System.Web.HttpApplication.CallHandlerExecutionStep.OnAsyncHandlerCompletion(System.IAsyncResult ar) + 0x1f3 バイト
mscorlib.dll!System.Threading.Tasks.Task.Execute() + 0x6e バイト mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System. Threading.ExecutionContext executionContext、System.Threading.ContextCallback コールバック、オブジェクトの状態、bool preserveSyncCtx) + 0x285 バイト mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext、System.Threading.ContextCallback コールバック、オブジェクトの状態、 bool preserveSyncCtx) + 0x9 バイト
mscorlib.dll!System.Threading.Tasks.Task.ExecuteWithThreadLocal(ref System.Threading.Tasks.Task currentTaskSlot) + 0x1c5 バイト
mscorlib.dll!System.Threading.Tasks.Task.ExecuteEntry(bool bPreventDoubleExecution) + 0xb0 バイト
mscorlib.dll !System.Threading.ThreadPoolWorkQueue.Dispatch() + 0x1ea バイト
[管理された移行へのネイティブ]
[アプリドメインの移行]
[管理された移行へのネイティブ]

これは、コードが既に応答を返した後に発生するようです。

これが発生すると、次のリクエストはまったく処理されませんが、次のリクエストは通常​​に戻ります。

この動作の理由は何ですか? CurrentModuleContainer.Get メソッドのソース コードを調べたところ、null ポインター例外をスローできるのは Http コンテキストだけのようです。

4

1 に答える 1

0

例外はさまざまな理由から発生する可能性がありますが、ハンドラーで現在の HttpContext にアクセスしようとしていると推測できます。これは、非同期終了関数中に null になる可能性があります。

于 2012-07-15T21:20:02.837 に答える