web-dev-qa-db-ja.com

スレッドは中止されていました

Server.Transferを使用しています。すべて正常に動作しますが、例外ログには次の例外が表示されます。

System.Threading.ThreadAbortException: Thread was being aborted.
   at System.Threading.Thread.AbortInternal()
   at System.Threading.Thread.Abort(Object stateInfo)
   at System.Web.HttpResponse.End()
   at System.Web.HttpServerUtility.Transfer(String path, Boolean preserveForm)
   at System.Web.HttpServerUtility.Transfer(String path)

上記の例外を回避するためのアイデア。

31
Syed Tayyab Ali

この例外は、現在のメソッドの実行を停止するためにServer.Transferの呼び出しによってスローされます。Response.Redirectを実行すると、まったく同じことがスローされます。

次の2つの選択肢があります。

  • ThreadAbortExceptionをキャッチして再スローする/ Server.Transferを再実行する
  • キャッチされない場所でのみServer.Transferを実行するようにしてください(推奨)

EDIT:スクラッチ、 http://support.Microsoft.com/kb/312629 には他にもいくつかの提案があります試してみてください。ただし、上記の#2をお勧めします。

40
Justin

これを解決する別の方法は、生成されたエラーをキャッチし、再スローしないことです。

        catch (ThreadAbortException)
        { 
        }
9

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

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

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

ダウンロードサンプルの例については、このリンクにアクセスしてください。 http://jayeshsorathia.blogspot.com/2012/03/thread-was-being-aborted-error-occured.html

8
Jayesh Sorathia

Caling Server.Transferは、常にThreadAbortExceptionをスローするResponse.Endを呼び出します。これは「特別な」例外です。これは、catchブロックでキャッチできますが、catchブロックの最後に常に再スローされるためです。エラーロギングでThreadAbortExceptionsを無視します。

8
Matt Wrock

Response.End()HttpContext.Current.ApplicationInstance.CompleteRequest();に置き換えます

1
Zuhair Ali

Response.End()を次のように置き換えると、問題の修正に役立ちました。

Response.Flush(); Response.Close();

参照 Response.End()の代わりにResponse.Flush()を使用できますか

1
user6706374