web-dev-qa-db-ja.com

ASP.NETで「スレッドが中止されました」と表示されるのはなぜですか?

なぜこれが起こるのか分かりませんし、スレッドを明示的に中止することもありませんので、少し驚きです。しかし、私は例外を記録し、私は見ています:

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

System.Threading.WaitHandle.WaitOneの呼び出しで発生するようです。この例外がどこまで続くかはわかりません。ログをキャッチしてエラーを飲み込むため、スレッドが終了するとは思わない。

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

51
user34537

いいえ、ThreadAbortExceptionは単純な Response.Redirect によってスローされます

48
Icarus

Application_Startでスレッドを生成する場合、それらは引き続きアプリケーションプールのAppDomainで実行されます。

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

その場合、Application_Startからのものを含め、AppDomainから開始したスレッドはすべて中止されます。

この質問では、アプリケーションプールとリサイクルについて詳しく説明します。 Appdomainリサイクルとは何ですか

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

40
Chris Shain

ASP.NETは、必要に応じてワーカープロセスを常に生成および終了します。スレッドがASP.NETによってシャットダウンされている可能性があります。

古い回答:

既知の問題: PRB:Response.End、Response.Redirect、またはServer.Transferを使用するとThreadAbortExceptionが発生する

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

または

try
{
    Response.Redirect("bla.aspx");
}
catch (ThreadAbortException ex)
{
}
38
rick schott

ASP.NETでホストされるWebサービスの場合、構成プロパティはexecutionTimeoutです。

<configuration> <system.web>

<httpRuntime executionTimeout="360" />

</system.web>

</configuration>

これを設定すると、スレッド中止例外はなくなります:)

14
Abhimanyu Garg

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

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

Server.Transferの場合は、代わりにServer.Executeメソッドを使用します。

このリンク にアクセスして、サンプルをダウンロードしてください。

9
Jayesh Sorathia

このエラーは、応答を複数回終了しようとすると発生する可能性があります。既に述べた他の回答として、応答を終了するさまざまなメソッドがあります(Response.End、またはResponse.Redirectなど)。連続して複数を呼び出すと、このエラーが発生します。

Response.Endを使用した後にResponse.TransmitFileを使用しようとしたときにこのエラーが発生しました。

7
jahu

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

代わりにFormsAuthentication.RedirectFromLoginPageを実行して修正しました。

1
Cosmin