問題タブ [threadpool]

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 投票する
3 に答える
3400 参照

.net - .Net ThreadPool スレッドの例外

重複: ThreadPool.QueueUserWorkItem から例外をキャッチする方法は?


複数のデータベースやその他のオフライン リソースを呼び出す多数の独立したリモート呼び出しのために、.Net ThreadPool で複数のデリゲートをキューに入れています。これらの呼び出しを ThreadPool のキューに入れることで、それらを同時に実行し、全体的な待ち時間を最小限に抑えることができます。

ただし、バッチ全体をトランザクションで処理する必要があります。つまり、すべての子スレッドが成功した場合にのみ、親スレッドの出力を続行できるようにする必要があります。失敗したときにカスタム例外をスローするように子スレッドをコーディングしましたが、これらの例外は親スレッドで「キャッチ」できないため、これにより親スレッドがクラッシュすることがわかりました...

これが発生したときに CLR によって UnHandledExceptionEvent がスローされることについて読みましたが、これらの子スレッドがキューに入れられて生成されるメソッドでこの例外を「処理」して、子の成功に基づいてすぐに下流の処理を制御する必要があります。 threeads...どうすればいいですか?

0 投票する
0 に答える
2817 参照

c# - C# でスレッドプールを待機する

の複製

プールされたスレッドが完了するまで待ちます。

スレッドプールに与えられるのを待っている X 個の関数があり、スレッドプールのスレッドの最大数は 5 です。すべての X 関数が実行されるまでメインスレッドを待機させるソリューションを見つける必要があります。

コードは次のようになります。

すべての関数が実行されるまでメインスレッドを待機させたい。

簡単な解決策は、ManualResetEvents の Rulecnt no を作成してスレッドに渡し、すべてのシグナルが到着するのを待つことです。

しかし、いつでも実行できるスレッドの最大数は 5 であるため、ManualResetEvents を 5 つだけ使用できますか?,可能であれば、どのようにすればよいでしょうか?

または解決策があれば説明してください。

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

multithreading - シャットダウン時のThreadPool、QueueUserWorkItem、およびDeadlock

ここで説明するようなスレッドプールを実装しました

スレッドプールのAllenBauer

非常に単純な実装で、正常に動作しますが、アプリケーションがシャットダウンしなくなりました。2つのワーカースレッド(および他の1つのスレッド、キューイングスレッド)が関数でスタックしているようです

QueueUserWorkItem(スレッドプールの実装で使用されるWinAPI関数)のヘルプエントリでIOの完了について何か読んだことを覚えていますが、正しく理解できませんでした。実行に時間がかかる可能性があり、既存のワーカースレッドが終了するのを待つのではなく、新しいワーカースレッドを作成する必要があるため、ワーカースレッドにWT_EXECUTELONGFUNCTIONを使用しました。ワーカースレッドに割り当てられたタスクの一部は、I/O処理を実行します。WT_EXECUTEINIOTHREADを使用しようとしましたが、役に立たないようです。

メインスレッドは、コールスタックが存在しないクリティカルセクションへのエントリを待機していることに注意してください。

私がここで間違っていることについて何か考えはありますか?よろしくお願いします。

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

c# - ラムダ式と匿名メソッドを使用した ThreadPool.QueueUserWorkItem

スレッドプールの新しいスレッドに 2 つのパラメーターを渡すのは複雑な場合がありますが、ラムダ式と匿名メソッドを使用すれば、次のようにできるようです。

ここで、この例を単純化しましたが、次の点が重要です。

  • 渡される文字列オブジェクトは不変であるため、スレッドセーフです
  • s1 変数と s2 変数は、try ブロックのスコープ内で宣言されます。このブロックは、作業をスレッド プールのキューに入れたらすぐに終了します。そのため、s1 変数と s2 変数はその後変更されることはありません。

これに何か問題がありますか?

別の方法は、test、s1、s2 の 3 つのメンバーを持つ不変型を実装する新しいクラスを作成することです。これは、現時点では何のメリットもない余分な作業のように思えます。

0 投票する
6 に答える
20316 参照

c# - ThreadPool.QueueUserWorkItem から例外をキャッチする方法は?

例外をスローする次のコードがあります。

アクションが例外をスローすると、プログラムがクラッシュします。この状況を処理するためのベスト プラクティスは何ですか?


関連: .Net ThreadPool スレッドの例外

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

.net - アプリケーションの存続期間中の .Net CF 実行スレッド

デバイスにインストールされているサードパーティのメッセージ キューイング ソフトウェアを利用する C# で .Net Compact フレームワーク アプリケーションを開発しています。

私はこの環境にかなり慣れていないので、アーキテクチャのいくつかの重要な概念を実行して、正しい軌道に乗っているかどうか、またはどのように改善できるかをより賢明な目で確認できるかどうか疑問に思っていました.

アプリケーションの実行中は、メッセージ キュー ライブラリをバックグラウンドで実行し続ける必要があります。これにより、通知が発生し、受信メッセージがアプリケーションに通知され、アプリケーションが生成するメッセージを処理できるようになります。アプリケーションの存続期間全体で実行する必要があるため、これを行う最善の方法は、アプリケーションの起動時に独自のスレッドで実行することだと考えていますか?

この投稿をコードであふれさせたくなかったので、重要だと思われるセクションを追加しました。さらに明確にする必要がある場合はお知らせください。

このようにアプリケーションが起動すると、別のスレッドでメッセージ プロセスを開始します。

MessageProcessor は、メッセージング ライブラリのファサードであり、やり取りを簡素化し、単一のインスタンスを保持します。以下にその一部を掲載しました。配信不能のイベントを発生させ、メッセージが受信されたときに通知します。

最初に Start メソッドが呼び出され、セッションが確立されます。その後、通知の受信を開始し、メッセージを送信できるようになります。

メッセージが受信されると、現在、ThreadPool を介して別のスレッドでイベント処理を管理しています。これは、他の通知やメッセージに継続して応答するためです。

これは合理的なアプローチに見えますか? また、メッセージ キューイング ライブラリがアプリケーションから分離して処理できるようになりますか?

アドバイスをいただければ幸いです。お時間をいただきありがとうございます。

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

java - Java ThreadFactory の問題

私のアプリでは、カスタム ThreadFactory でスレッドプールを使用しています。

私のコードは次のようになります:

ただし、さまざまな Runnables をスレッドプールに送信した後、(IDE、Intellij IDEA から) 現在のスレッドをダンプすると、次のようになります。

(スレッド 2 から 9 までの同様のスタック トレースと同様)

したがって、基本的にスレッド番号1,2,3,4,5,6,7,8,9,10を取得する代わりに、スレッド番号1,1,2,3,4,5,6,7,8,9を取得します

すべてが正常に機能しているように見えますが、明らかに当惑しています。

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

c# - Visual Studio が ThreadPool 作業項目から例外をスキップするのはなぜですか?

私はこの他の投稿を認識していますが、私の状況には当てはまらないようです。

まず、私の環境は次のとおりです
。Windows XP 64 ビット SP3。Visual Studio 2008 SP 付き。.NET 3.5 SP1; WPF アプリケーション。

私の問題は、例外が発生した場所に足を踏み入れることができないことです。デバッグセッションを続行する代わりに、実行を続けるだけです。

ここにいくつかのコードがあります-私はそれをすべて書いたわけではないので、命名に関するコメントは必要ありません:)

次に、そのSetTcpChannelメソッドで:

そして最後に、実際に例外が発生する場所 ( 内EnsureTcpSocket):

これが私がやっていることです:

  1. EnsureTcpSocket内の行に ブレークポイントを設定し SetTcpChannel
  2. F11 (ステップ イン)で、コードEnsureTcpSocket の一部を確認できます_tcp
  3. TcpClientコンストラクターを F10 (ステップオーバー) してみてください

その最後のステップで、アプリケーションはデバッガーから戻ってきて実行を続け、例外は見られません。

何か案は?

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

vb.net - ThreadPool.QueueUserWorkitemを使用してスレッドを生成するときの互換性のない署名

エラーは次のとおりです。

メソッド'PrivateSub ProcessToolWork()'には、デリゲート'Delegate Sub WaitCallback(state As Object)'と互換性のある署名がありません。

ここでの取引は何ですか?この方法でスレッドを生成するときにこのエラーが発生したことはありません。

これが私のルーチンの定義です:

何か問題がありますか?

私はまた、このアイテムのために次のように新しいWaitCallbackを作成しようとしました: