問題タブ [thread-abort]

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.

0 投票する
5 に答える
34089 参照

asp.net - ASP.NET System.Web.HttpResponse.End() が呼び出されると、現在のスレッドは中止されますか?

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

最初のチャンス

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

アップデート

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

0 投票する
1 に答える
12790 参照

vb.net - SqlClient 呼び出しにより、「スレッドは SNINativeMethodWrapper.SNIPacketGetConnection(IntPtr パケット) で中止されました」

この問題を切り分けて解決するために、どんなに単純か複雑かに関係なく、提案をいただければ幸いです。

小さなレポート ファイルを生成するコードが少しあります。コレクション内の各ファイルに対して、ストアド プロシージャが実行され、XML リーダー (かなり大きな結果セット) を介してデータが取得されます。私がこれらすべてを作成し、ステップスルーしたとき、すべてが順調です。ファイルが生成され、エラーはありません。

このライブラリはリモート経由で呼び出され、IIS 経由でホストされます。コンパイルされたライブラリをデプロイして呼び出すと、レポートの一部を生成できますが、スレッド中止例外がスローされます。デバッガーを asp ワーカー プロセスにアタッチし、コードをステップ実行しても、問題はありません。

この失敗はかなり一貫しているため、類似点を探したところ、異なるレポートで失敗が発生していることがわかりましたが、ほぼ同じ発生時点で発生しているようです。

これにより、デバッガーがオーバーライドしているのはタイムアウト設定であると考えるようになりました。プロセス全体の大まかなタイミング (失敗したコードの 1 つの部分ではありません) を行ったところ、約 200 秒後に失敗したようです。web.config の executionTimeout は 600 分 (十分な長さ) に設定されています。このサーバー アプリケーションには他にも COM+ トランザクション (2 分間のタイムアウト) を必要とする部分がありますが、これはその 1 つではありません。私は、それがヒットする可能性のあるタイムアウトについて途方に暮れています(約200秒のマークで)。

SQL 接続のタイムアウトはデフォルトのまま (接続は正常に開きます)、コマンドのタイムアウトは 300 秒です (コマンドの実行に 12 ~ 15 秒しかかかりません)。

  • 欠落している可能性のある他のタイムアウトはありますか?

SQL プロファイラーを実行したところ、結果が正しく返されたことが示されました (すべてのステートメントと RPC が完了しました - エラーはありません)。SSMS 経由でコードを実行すると、完璧な結果が得られます。

リフレクターを使用して、SNINativeMethodWrapper を掘り下げました。これはアンマネージ コードのラッパーであり、実際に何をしようとしているのかわかりません。コードが SQL サーバーから TDS を受信し、ラッパーがパケットに関連付けられた接続を取得しようとしているが、取得できないと想定することしかできません (おそらく間違っています)。

  • このラッパーが何をすべきか知っている人はいますか?
  • このコードをトレース/デバッグして、失敗の原因を突き止める方法はありますか?

さまざまな方法 (ExecScalar、DataAdapter) を使用してみましたが、すべて内部で ExecuteReader を使用しています。

接続プールを無効にして、クライアントがサーバーと同じパケット サイズを使用するように強制しようとしました。

  • これの原因、または問題を特定して修正するために私ができることについて、誰か考えがありますか?

これは、例外が生成される呼び出しコードです。

スタック

0 投票する
8 に答える
10797 参照

c# - thread.abort() エラー C# を抑制するにはどうすればよいですか?

プログラムのロード中にバックグラウンド スレッドにスプラッシュ スクリーンを表示しています。ロードしたら、スレッドを中止します。唯一の目的は Now Loading スプラッシュ フォームを表示することだったからです。

ThreadAbortException私の問題は、スレッドを中止すると、ユーザーが [続行] をクリックするだけでスローされることです。

どうすればこれに対処できますか? みたいに抑えようとしてたのに -->

しかし、ここで怒鳴られそうな気がして、うまくいきません。

ありがとう!

0 投票する
1 に答える
174 参照

c# - 応答しないスレッドの問題

ボタンをクリックすると複数のスレッドを実行するWebアプリケーションがあり、各スレッドは異なるipAddressesでIO呼び出しを行います(Windowsアカウントにログインしてからファイル操作を行います)。30 秒のしきい値があります。しきい値を超えた場合のログイン試行中に、ipAddress のデバイスが私の条件と一致しないため、気にしないと思います。Thread.Abort() は、時間がかかる可能性がある IO 呼び出しが完了するのを待つという私の状況には合いません。

しきい値タイムアウトの直後に、スレッドの状態に従って db 操作を実行してみました。問題なく動作しましたが、ログ ファイルを確認したところ、応答していないスレッドの thread.IsAlive プロパティがまだ true であることに気付きました。ローカル pc でいくつかのデバッグを行った後、pc がひどくクラッシュした可能性があるデッドロック状態 (と思われます) に遭遇しました。

つまり、button_click の実行直後に (IO 操作を待機している) 応答しないスレッドを (強制的に) 強制終了することについて何か考えはありますか?

(PS:スレッドプールは使用していません)

オグザン

編集

さらに明確にするために、

各 ipAddress で指定されたローカル管理者の資格情報を検証し、連続するものに DB レコードを挿入する必要があります。残りは、気にしません。

私の検証方法では、最初に管理者ユーザーになりすますために advapi32.dll をインポートして、win32 の logonuser メソッドを呼び出しました。その後、認証を確認するためだけに、Directory.CreateDirectory メソッドを使用してリモート sys ドライブに一時ディレクトリを作成しようとしました。例外がスローされた場合 (UnauthorizedAccessException または IOException)、リモート マシンは対象外です。それ以外の場合は、取得したので DB に挿入します。

特定の IP 範囲に対して同期的な方法で検証メソッドを呼び出したところ、一連の一連のエンドポイントに対して正常に機能しました。しかし、関係のない ipAddress 範囲に対してメソッドをテストしたところ、各検証の試行が完了するまでに 20 秒から 5 分かかりました。

次に、設計をマルチスレッド方式に変更し、各検証を個別のスレッドで実行し、しきい値の最後で応答しないスレッドを中止することにしました。問題は、thread.abort が状況にうまく適合しなかったことです。これは、実際には IO 命令の戻りを待機し (これは望ましくありません)、その後 ThreadAbortException を発生させます。

連続するスレッドの実行を完了するために、応答しないスレッドを無視して DB 操作を続行し、ボタン クリック メソッドから戻ります (応答しないスレッドはその時点でまだ生きていました)。ボタンクリックを(デバッグモードで)数回実行した後、悪いシステムクラッシュが発生するまで、すべてが問題ないように見えました。問題はおそらく、IIS サービスの下で生きているスレッドの数が増えたことです。

解決

スレッドがタイムリーに応答しない原因は、ネットワーク パスが見つからない状況です。私の解決策は、IO 呼び出しを行う前に、ポート 135 で TCP 経由の接続を確認することです (ポート 135 は、Windows の RPC には必須です)。デフォルトのタイムアウト期間は 20 秒です。タイムアウトを設定する必要がある場合は、BeginConenct を使用します。他のオプションはPingingです(ICMPがネットワークで有効になっている場合)

0 投票する
1 に答える
289 参照

.net - .NET でスレッドを中止すると、このコードが破損する可能性がありますか?

ちょっとした紹介:

複雑なマルチスレッド アプリケーション (エンタープライズ サービス バス ESB) では、Thread.Abort を使用する必要があります。この ESB は、ハードウェア セキュリティ モジュールと通信するユーザー作成モジュールを受け入れるためです。したがって、このモジュールがデッドロックしたり、ハードウェアが応答しなくなったりした場合は、このモジュールをアンロードするだけで済み、残りのサーバー アプリケーションは実行し続ける必要があります。

そのため、ユーザー セクションでのみコードを中止できることを保証する中止同期メカニズムがあり、このセクションは AbortAble としてマークする必要があります。これが発生した場合 (中止)、次のコードで ThreadAbortException がスローされる可能性があります。

たとえば、モジュールは AbortSection にあり (同様のメソッド StartAbortSection を呼び出すことによって入力されます)、ServerAplication はユーザー モジュールを中止することを決定しますが、この決定の後、実際の Thread.Abort の前に、モジュールはこのメソッドを呼び出すことによって NonAbortableSection に入りますが、実際にはそのロック オブジェクトでロックが取得されます。 .

したがって、ロックは中止が実行されるまでブロックされますが、このコードでこのブロックに到達する前に中止を実行することもできます。しかし、このメソッドを持つオブジェクトは不可欠であり、このコードの断片がいつでも中止しても安全であることを確認する必要があります (破損しない - たとえば、辞書から読み取るときに何が起こるかわかりません..)。

したがって、threadIdMap は Dictionary(int,ManualResetEvent) であり、ロック オブジェクトは ManualResetEvent のインスタンスであることに言及する必要があります。

私の質問を理解していただければ幸いです。大きくてすみません。

0 投票する
1 に答える
680 参照

java - サーブレットでのリクエストの予期しない終了の処理

現在、Jersey/Tomcat を使用して REST Web サービスを開発しています (ただし、一般的なサーブレット/コンテナーの回答は大歓迎です)。クライアントが、MySQL 接続から大量のデータを返すサービスで GET リクエストを行う場合。

OOM 例外を回避するために、MySQL のストリーミング モードを使用します。

ただし、ロード中にクライアントがリクエストを中止した場合、MySQL 接続は閉じられません。一度に 1 つの「ストリーミング」リクエストしか実行できないため、その後、サーバーは他のリクエストを処理しません。

問題は、サーバーでリクエストが終了するたびに (通常または異常に) 通知を受け取るにはどうすればよいかということです。ある種のリスナーを登録できますか? または UncaughtExceptionHandler を使用しますか?

ジャージーで例外を処理して「応答」に変換することについて多くのことを見てきましたが、リクエストの途中での終了を処理するものは何もありません。Jersey または Tomcat は、通知なしにスレッドを単純に破棄する可能性があると思います。メソッドの重要な部分で例外をキャッチして、そのようなスレッドの中断がいつ発生したかを知ることはできますか?

よろしくお願いいたします。

ラファエル

0 投票する
3 に答える
1613 参照

c# - AcceptSocketが原因で、Thread.AbortがThreadAbortExceptionをスローしていないようです。

次のスレッドを呼び出しChannelServer.ListeningThread.Abortていますが、何も起こらないようです。もっと具体的に言いたいのですが、これ以上何も考えられません。スローされるものはないようThreadAbortExceptionです。この例外は、ブロッキングリスナーに関係なくスローする必要があります(ブロッキング受信しているスレッドで完全に機能します)。

重要な編集:Lyrikがテストのために提案したように、のManualResetEvent.WaitOne代わりにAcceptSocket、それは完全に機能します。どうしてAcceptSocketブロックするのThreadAbortException

リンク:このフォーラムスレッドは同じ問題について議論しているようですが、私はそれから何も理解できません:http ://www.tek-tips.com/viewthread.cfm?qid=319436&page=413

0 投票する
4 に答える
3803 参照

c# - 複数のスレッドを中止するにはどうすればよいですか?

このコードでbutton1は、 を 2 回クリックすると、2 つの個別のスレッドが作成されます。ワンクリックで、ヒープ上に新しいスレッドを作成し、フィールドがヒープ上のt1新しいスレッドを指します。をクリックするbutton2と、最後のスレッド (をt1参照) が中止されます。

他のスレッド を中止するにはどうすればよいですか?

0 投票する
2 に答える
5502 参照

c# - C#でスリープしているスレッドをスリープ解除するにはどうすればよいですか?

人々がそれを提案する前に: 私はそれを回避する方法を見つけようとする以外の目的でThread.sleepを使用していません。.Sleep()フリーではないかもしれない他の人の将来のコードを処理しようとしています。私は物事を同期させることがどれほど恐ろしいかをよく理解しています。

コードのチャンクでスレッドを受け入れます。このスレッドの存続期間に制限を設定できるようにしたいと思います。私の通常の方法は次のようになります。

それ以来、私は睡眠が終わる前に眠っている糸を起こせないようだということを発見しました。さらに悪いことに、10ミリ秒のライフタイムを与えた場合でも、これはコンソールに書き込みます。

.Abort()はスレッド実行の厳しい制限ではないことに気づきましたが。警告は2秒で十分なようですが、そうではないと思います...

WaitSleepJoinステータスと.Interrupt();をチェックしてみました。スレッドをクラッシュさせるか、例外をスローします(申し訳ありませんが、どちらかわかりません。デバッガーが実行されていない場合はクラッシュし、実行されている場合は割り込みが呼び出されなかったかのように実行されます)、2秒後もコンソールに書き込みます。.Resume()は、スリープ状態のスレッドに対しては何も行わないようです。

スリープが期限切れになるのを待たずにスレッドをウェイクアップする方法はありますか停止は「即時」ではないことを理解しています。そのため、Console.WriteLineは関係なく呼び出される可能性があります。私を悩ませているのは2秒の待機です。10日間待つとどうなりますか?入ってくるスレッドを制御できないので、知る方法がなく、そのようなことを防ぐ方法がないようです...

0 投票する
2 に答える
3056 参照

c# - .NET スレッド: 開始されていないスレッドでアボートをキャプチャするにはどうすればよいですか?

編集:これは難点のように思われるので、邪魔にならないようにします:

これを同期には使用していません。長時間実行されるタスクが不要になった/望ましくなくなったときに単純に強制終了します。
仮説的には、これらのスレッドが単純にコンソールに書き込み (「スレッド 1」など)、ランダムな長さだけスリープしてから終了すると仮定します。それらが中止された場合は、別のコンソール書き込みで通知してもらいたいです (たとえば、「スレッド 1 が中止されました」)。また、通常の機能を実行する可能性がなく、実行前に中止しようとした場合に、中止コードに直接ジャンプできるようにしたいと考えています。通常の機能中に中止された場合、もちろん両方を出力します。


Visual Studio 2008 で .NET 2.0 を実行している ASP サイトで、順番に実行したいスレッドのチャンクがあり (どれだけ重要かはわかりませんが、問題はあります)、それらのスレッドにはクリーンアップ コードが中止されている可能性があります。これは、タスクの進行状況に関係なく実行する必要があります。そこで、次のようなスレッドを立てます。

ここで、一連のスレッドを途中で中止したい場合でも、後でクリーンアップを行うことが望ましい場合があります。MSDN を見ると、開始されていないスレッドを .Abort() してから .Start() できることがわかります。この時点で例外を受け取り、正常に実行されます。または、中断されたスレッドを .Join() して、中断が完了するのを待つことができます。おそらく、それらを組み合わせることができます。

http://msdn.microsoft.com/en-us/library/ty8d3wta(v=VS.80).aspx
スレッドが中止されるまで待機するには、Abort メソッドを呼び出した後にスレッドで Join メソッドを呼び出すことができますが、待機が終了する保証はありません。
開始されていないスレッドで Abort が呼び出された場合、そのスレッドは Start が呼び出されたときに中止されます。ブロックされているスレッドまたはスリープしているスレッドで Abort が呼び出されると、スレッドは中断されてから中止されます。

ここで、このコードをデバッグしてステップ実行すると、次のようになります。

出力がまったく表示されず、try または catch ブロックのブレークポイントにも到達しません。
奇妙なことに、ThreadStartException は .Start() の可能なスローとしてリストされていません。ここから: http://msdn.microsoft.com/en-us/library/a9fyxz7d(v=VS.80).aspx (またはその他のバージョン) )

これは、スレッドがクリーンアップ コードにジャンプする必要があるかどうかを示す start パラメーターを使用し、Abort 呼び出しを前に行うことで回避できることを理解しています (これはおそらく私が行うことです)。そして、スレッドを .Start() してから .Abort() することができましたしかし、.Start と .Abort の間に不確定な時間が経過する可能性があるため、信頼性が低いと考えており、ドキュメントには、私の元の方法が機能するはずであると書かれているようです。

何か不足していますか?ドキュメントは間違っていますか?

編集:ああ。また、パラメーター化されていない Thread(Start) で .Start(param) を呼び出すことはできません。試行錯誤以外に、スレッドがパラメータ化されているかどうかを確認する方法はありますか? プライベート m_Delegate が表示されますが、パブリックはありません...