問題タブ [threadabortexception]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
visual-studio - Visual Studio は ThreadAbortException をキャッチしません
VS デバッグ例外ダイアログで ThreadAbortException を設定しましたが、コードで Thread.Abort() を明示的に実行しても、壊れることはありません。
コンソールに次のようなエントリが表示されます。
これらの例外でVSを中断させる方法はありますか? (私はデスクトップ用に VS Express 2012 を使用していますが、必要に応じて完全な VS にアクセスできます)
c# - c# - ThreadAbortException の再スロー
MSDNによると、Thread.Abort
メソッドについて-
このメソッドがスレッドで呼び出されると、システムはスレッドで ThreadAbortException をスローしてスレッドを中止します。ThreadAbortException は、アプリケーション コードでキャッチできる特別な例外ですが、ResetAbort が呼び出されない限り、catch ブロックの最後で再スローされます。ResetAbort は中止要求をキャンセルし、ThreadAbortException がスレッドを終了させないようにします。未実行の finally ブロックは、スレッドが中止される前に実行されます。
したがって、例外は、最も直接のcatch
ブロックから、またはすべてのカプセル化catch
ブロックから 1 回だけスローされますか? また、未実行finally
のブロックが実行されるとは、完全に未実行のブロックと部分的に実行されたブロックの両方を含みますか?
c# - PrepareConstrainedRegions と Thread.Abort のこの予期しない動作を説明できますか?
今夜、私は制約付き実行領域をいじって、より細かい部分の理解を深めました。以前にも時々使用したことがありますが、その場合は、ほとんどの場合、確立されたパターンに厳密に従っていました。とにかく、うまく説明できない奇妙なことに気づきました。
次のコードを検討してください。注: .NET 4.5 を対象とし、デバッガーをアタッチせずにリリース ビルドでテストしました。
このプログラムの出力はどうなると思いますか?
- didfinally=真
- didfinally=偽
推測する前に、ドキュメントを読んでください。以下に関連するセクションを含めます。
制約付き実行領域 (CER) は、信頼できるマネージド コードを作成するためのメカニズムの一部です。CER は、共通言語ランタイム (CLR) が帯域外例外をスローしないように制限されている領域を定義します。これにより、領域内のコードが完全に実行されなくなります。その領域内では、ユーザー コードは、帯域外例外のスローにつながるコードの実行を制限されます。PrepareConstrainedRegions メソッドは、try ブロックの直前に配置する必要があり、catch、finally、および fault ブロックを制約付き実行領域としてマークします。制約付き領域としてマークされると、コードは強力な信頼性コントラクトを持つ他のコードのみを呼び出す必要があり、コードが障害を処理する準備ができていない限り、準備されていないメソッドまたは信頼できないメソッドに割り当てたり、仮想呼び出しを行ったりすることはできません。CLR は、CER で実行されているコードのスレッド アボートを遅らせます。
と
信頼性の try/catch/finally は、アンマネージ バージョンと同じレベルの予測可能性を保証する例外処理メカニズムです。catch/finally ブロックは CER です。ブロック内のメソッドは事前の準備が必要であり、中断できないようにする必要があります。
私が今特に関心を持っているのは、スレッドのアボートを防ぐことです。Thread.Abort
通常のバージョンと、CLR ホストが完全に中途半端になり、強制的に中止できるバージョンの2 種類があります。ブロックはすでにある程度finally
保護されています。Thread.Abort
次に、そのfinally
ブロックをCERとして宣言すると、CLRホストの異常終了からの保護も強化されます...少なくともそれが理論だと思います。
したがって、私が知っていると思うことに基づいて、#1を推測しました。didfinally=True と表示されるはずです。ThreadAbortException
コードがまだブロック内にある間に が挿入され、 CER がなくてもtry
、CLR によってfinally
ブロックが期待どおりに実行されますか?
まあ、これは私が得た結果ではありません。まったく予想外の結果になりました。#1も#2も私には起こりませんでした。代わりに、私のプログラムは でハングしましたThread.Abort
。これが私が観察するものです。
- 遅延スレッドが存在すると、ブロック
PrepareConstrainedRegions
内でアボートします。try
- が存在しないため、ブロックで
PrepareConstrainedRegions
使用できます。try
それで、百万ドルの質問はなぜですか?ドキュメントには、この動作についてはどこにも言及されていません。実際、私が読んでいるもののほとんどは、finally
特にスレッドの異常終了を防ぐために、重要な割り込み不可能なコードをブロックに入れることを実際に示唆しています。
おそらく、ブロックに加えて、ブロック内PrepareConstrainedRegions
の通常のアボートを遅らせます。しかし、CLR ホストの中止は、CERのブロックでのみ遅延しますか? 誰かがこれについてもっと明確にすることができますか?try
finally
finally
c# - WaitHandle.WaitOne は ThreadAbortException をスローできますか?
次の例外が発生します。
そして、私はそれがどのように起こるかについて混乱しています。私のコードは別のスレッド (WaitHandle を設定するスレッドを含む) を中止している可能性がありますが、この特定のスレッドを中止していないことは確かです。これは、フレームワークが例外を発生させているか、別のスレッドのスレッド中止が何らかの形でこのスレッドに流れ込んでいると私に信じさせます。どちらもありえないと思っていました。
では、このスレッドで Thread.Abort() を呼び出していない場合、どのようにして ThreadAbortException が発生するのでしょうか?
c# - 2 つのプロセスと出力リダイレクトを使用するこのコードで ThreadAbortException がキャッチされないのはなぜですか?
以下のコードは、問題の説明のみを目的としています。CodeDom を使用してソースをコンパイルする部分は無視してください。また、試してみると、「他のプロセス」の実行可能ファイルが実行されたままになり、CPU時間が無駄に消費されます。
本当の問題は、スレッドを開始してからスレッドを中止し、「スレッド中止が開始されました」というメッセージが表示され、
タイプ 'System.Threading.ThreadAbortException' の初回例外が mscorlib.dll で発生しました
デバッガー出力にメッセージが表示されますが、どちらcatch
のfinally
ブロックも呼び出されず、それらのブロックからの出力はありません。
もちろん、リダイレクトされた出力を処理するために作成された余分なスレッドは中止されないため、プログラムは永久にハングしますが...
なぜ呼び出され、呼び出さcatch
れfinally
ないのですか?
threadabortexception - 同時ユーザー アクセス中の XslCompiledTransform での ThreadAbortException
アプリケーションで Visual Studio team Server 2005 を使用して自動化テストを実行しています。アプリケーションは、BO レイヤーからのマルチスレッド機能を備えた WCF サービスです。VSTS のユーザー負荷は 2 で、Think Time は 20 秒です (1 つの要求を送信した後の待機時間)。しかし、これを行うと、アプリケーションは「System.Threading.ThreadAbortException」エラーを受け取ります。エラーが発生している特定の領域は、 XslCompiledTransform transform.Transform(xmlReader, outputXmlWriter) です。 これを行うことで、実際にxml(ビューモデルをシリアル化した後にxmlが生成される)をxsltオブジェクト(Transform)にフィードしようとしています。" System.Threading.ThreadAbortExceptionアプリケーションを正常にロードしている間はエラーは発生していませんが、複数のユーザーが同時に上記のメソッドにアクセスしている間は発生します。エラーの詳細は以下に掲載されています。
- ログ名: アプリケーション ソース: Proposal.Service 日付: 14/02/2014 1:44:20 AM イベント ID: 100 タスク カテゴリ: なし レベル: エラー キーワード: クラシック ユーザー: 該当なし コンピューター:
説明: タイムスタンプ: 14/02 /2014 6:44:20 AM メッセージ: HandlingInstanceID: 279fbd41-c40c-43aa-bc1a-07d3bc950cc8タイプ 'System.Threading.ThreadAbortException' の例外が発生し、キャッチされました。
2014/02/14 01:44:20 タイプ: System.Threading.ThreadAbortException、mscorlib、Version=2.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089 メッセージ: スレッドが中止されました。ソース: System.Xml.Xsl.CompiledQuery.1 ヘルプ リンク: ExceptionState: データ: System.Collections.ListDictionaryInternal TargetSite: Void (System.Xml.Xsl.Runtime.XmlQueryRuntime, System.Xml.XPath.XPathNavigator) スタック トレース: ( XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime、XPathNavigator {urn:schemas-microsoft-com:xslt-debug}current) at Root(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime) ) Execute(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime) at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlSequenceWriter results) at System.Xml.Xsl.1.GetTransformedXml(String inputFileName, Object viewModelPart)
at Proposal.Generator.Presenter.BaseClasses.BaseSectionPresenter
1. TransformTemplateUsingXslt (文字列 inputXsltName、ストリーム outpuStream、オブジェクト viewModelPart、ブール addNumberPart、ブール addstylePart、リスト1 richTextPlaceholder, List
1 richText、文字列 wordDoc)
c# - ReaderWriterLockSlim は ThreadAbortException に耐性がありますか?
次のコードが ThreadAbortException に対して耐性があり、孤立したロックに至らないかどうかを確認したいと思います。そうでない場合、ここで孤立ロックを回避するための最良のパターンは何ですか?
次のリンクhttp://chabster.blogspot.cz/2013/07/a-story-of-orphaned-readerwriterlockslim.htmlによると、孤立したロックを作成する方法はあります (または少なくともありました) が、サンプルを実行していましたしばらくの間、何の運もありません。
.NET 4.0 を使用しています
Debug と Release の動作に違いはありますか?