18

System.Web.HttpResponse.End() が呼び出されると、System.Thread.Abort が起動されますが、これは例外 (または起動) だと思いますか? 私はいくつかのログを取得しており、これはログファイルにリストされています...

最初のチャンス

exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll
12/14/2008 01:09:31::
Error in Path :/authenticate
Raw Url :/authenticate
Message :Thread was being aborted.
Source :mscorlib
Stack Trace :   at System.Threading.Thread.AbortInternal()
   at System.Threading.Thread.Abort(Object stateInfo)
   at System.Web.HttpResponse.End()
   at DotNetOpenId.Response.Send()
   at DotNetOpenId.RelyingParty.AuthenticationRequest.RedirectToProvider()
   at MyProject.Services.Authentication.OpenIdAuthenticationService.GetOpenIdPersonaDetails(Uri serviceUri) in C:\Users\Pure Krome\Documents\Visual Studio 2008\Projects\MyProject\Projects\Services\Authentication\OpenIdAuthenticationService.cs:line 108
   at MyProject.Mvc.Controllers.AuthenticationController.Authenticate() in C:\Users\Pure Krome\Documents\Visual Studio 2008\Projects\MyProject\Projects\MVC Application\Controllers\AuthenticationController.cs:line 69
TargetSite :Void AbortInternal()
A first chance exception of type 'System.Threading.ThreadAbortException' occurred in Ackbar.Mvc.DLL
An exception of type 'System.Threading.ThreadAbortException' occurred in Ackbar.Mvc.DLL but was not handled in user code

これは正常な動作であり、突然の突然の中断 (のように見える) ではなく、適切に中断することは可能ですか?

アップデート

これまでのところ、それは設計によるものであるというのが一般的な国勢調査です。ですから、この質問を受けて、コードを微調整して、スレッドを途中で終了させて​​正常に終了しているように感じないようにすることができるかどうかを確認できるかどうか疑問に思っています... 可能ですか? コード例?

4

5 に答える 5

11

「優雅な」中絶のようなものはありません。ただし、応答を終了してフレームワークに接続を閉じる代わりに、応答をFlush()するだけで済みます。この場合、応答をクライアントに送信する必要があると想定しています。つまり、一般的なケースです。

MSDNによると、Response.End()を呼び出すと、応答が途中で終了したときにThreadAbortExceptionがスローされます。実際には、例外を発生させたい場合にのみResponse.End()を呼び出す必要があります。

于 2008-12-13T14:36:08.333 に答える
6

はい、これは確かに仕様によるものです。マイクロソフトはそれを文書化しています。他にどのようにしてプログラムの残りの実行を停止しますか?

于 2008-12-13T14:41:12.877 に答える
3

現在の実行を停止するためにスタックを再帰的に繰り返す例外について、本質的に不愉快なことは何もありません。確かに、例外をスローして、例外のより低い場所でそれをキャッチするだけです。

私はあなたのロギングからそれをフィルタリングすることを検討します。ASP.Netヘルスモニタリングを使用している場合は、各例外を特定のプロバイダー(イベントログ、メールなど)に構成/マップして、threadabort例外の通知を受け取るかどうかを制御できます。カスタムロギングの場合は、ifを追加してチェックします。

ThreadAbortExceptionを食べることはできないので、ロギングコードがそのようなことをしている場合catch(Exception e) { // log exception and then do not throw again }でも、catchブロックが終了すると、FrameworkによってThreadAbortExceptionが再び発生することに注意してください。

于 2008-12-13T18:37:30.900 に答える