2011-10-02 127 views
38

なぜこのようなことが起きるのか分かりませんし、スレッドを明示的に中止することもありませんので、少し驚きです。しかし、私は例外を記録し、私は見ている:asp.netで「スレッドが中止されました」というメッセージが表示されるのはなぜですか?

System.Threading.ThreadAbortException - スレッドが中止されました。

System.Threading.WaitHandle.WaitOneへの呼び出しで発生するようです。私はこの例外がどれだけ遠くにあるかわからない。私はログを捕まえてエラーを飲み込んでスレッドが終了するとは思わない。

なぜ私はこれらのエラーが発生しているのですか?おそらく、私が強制的にサーバーを終了しているか、または再起動を要求しているのでしょうか?そうでなければ、何が原因なのでしょうか?

+0

Application_Startにあるコードを表示できますか? –

+0

@rick:あなたが探しているとは思っていませんが、ここではスニペットです。 'var obj1 = new MyServiceObject(); srv1 =新しいスレッド(obj1.Queue); ... srv1.Start() '。 obj1は使用ブロック内ではありませんので、時期尚早に処理されません。そのちょっとしたスレッドが起動時に起動します –

+0

この回答を「試してください」。この回答はhttp://stackoverflow.com/questions/20120800/system-threading-threadabortexception-on-generic-redirection/33999795#33999795 – Moumit

答えて

43

いや、ThreadAbortExceptionはシンプルResponse.Redirect

+1

hmmです。良い答え+1しかし、それはそうではありません。これは、実際には(通常はApplication_Startから)起動されたスレッドで発生しており、メインのリクエストパスでは発生していません。 –

+0

これは、ThreadAbortExceptionを取得するための唯一の方法です - あなたはそれが唯一の方法のように聞こえるようにします。例えば。 IISがそれを殺したので、> 90秒を要した要求になる可能性もあります。 – saille

24

ASP.NETスポーンによってスローされ、労働者が必要に応じて、すべての時間を処理殺すています。あなたのスレッドは単にASP.NETによってシャットダウンされるかもしれません。

旧回答:

既知の問題:あなたはApplication_Startにスレッドを生成した場合PRB: ThreadAbortException Occurs If You Use Response.End, Response.Redirect, or Server.Transfer

Response.Redirect ("bla.aspx", false); 

または

try 
{ 
    Response.Redirect("bla.aspx"); 
} 
catch (ThreadAbortException ex) 
{ 
} 
+0

hmm。良い答え+1しかし、それはそうではありません。これは、実際には(通常はApplication_Startから)起動されたスレッドで発生しており、メインのリクエストパスでは発生していません。 –

+0

この回答は私を助けました!ありがとう、私はこの問題であまりにも多くの時間を無駄にしていた – Lester

32

、彼らはまだアプリケーションプールのAppDomainに実行されます。

アプリケーションがしばらくの間アイドル状態(要求が入っていないことを意味します)またはその他の条件が満たされている場合、ASP.NETAppDomain全体をリサイクルします。

これが発生すると、のスレッドを含めて、そのスレッドから開始したスレッドはすべてAppDomainになりますが、中止されます。この問題のアプリケーションプールとリサイクルの詳細

ロット:What exactly is Appdomain recycling

あなたはIIS/ASP.NET内長時間実行プロセスを実行しようとしている場合は、短い答えは「ない」は通常です。それがWindowsサービスの目的です。

+0

それは起こっているものとまったく同じように聞こえる。別の質問があります...サイトが再度アクティブになったときにApplication_Startが再び実行されますか?それはそうではないようです(しかし、私は間違った何かをコード化したかもしれません) –

+2

それはありません。ここから:http://msdn.microsoft.com/en-us/library/ms178473.aspx "Application_StartおよびApplication_Endメソッドは、HttpApplicationイベントを表さない特別なメソッドです.ASP.NETはアプリケーションの存続期間それぞれのHttpApplicationインスタンスではありません。 –

9

両方のメソッドが内部的にResponse.Endを呼び出すため、この問題はResponse.RedirectServer.Transferのメソッドで発生します。

この問題の解決方法は次のとおりです。

Server.Transferの場合は、代わりにServer.Executeメソッドを使用してください。

this linkダウンロードサンプルのサンプルをご覧ください。

11

ASPでホストされているWebサービスの場合。NETは、構成プロパティは、executionTimeoutです:このスレッドは例外は、このエラーが複数回応答を終了しようとしているが原因で発生することができ:)

+0

これは、非同期Web呼び出しを行う際に修正されています。 – Jonny

+3

"これを設定するとスレッドの中止の例外は消えます.." – saille

+2

@saille正確には6分... –

4

離れて行く中止

<configuration> <system.web> 

<httpRuntime executionTimeout="360" /> 

</system.web> 

</configuration> 

セット。既に言及された他の回答として、応答を終了させるさまざまな方法があります(Response.End、またはResponse.Redirectなど)。複数行を連続して呼び出すと、このエラーが発生します。

Response.TransmitFileを使用してResponse.Endを使用しようとしたときにこのエラーが発生しましたが、これも応答を終了するようです。

+0

終了した後の応答で何かをすると、このエラーが発生する可能性があります。 – jahu

0

ユーザーのログインに成功した後に私がResponse.Redirectを実行したときにこのエラーが発生しました。

代わりにを使って修正しました。

関連する問題