1

実行中のタスクの基本的なキューがあります (3 つの別々のシステムと通信する c# WinForms アプリ)。Web サービスの 1 つが通常の速度で応答しないことを決定するまで、すべてが優れています。

ジョブをマルチスレッド化して高速化することに興味はありませんが、本番環境で使用しているので、少なくとも 2 つのスレッドでジョブを実行することの利点がわかります。トラックインを維持し、両方がブロックされた場合、おそらく任意の数のスレッドがブロックされ、私はそれを処理します。

質問は、これは私が今説明した一般的なパターンですか、そのパターンの名前、および/または素晴らしい参照またはフレームワーク、または車輪を再発明しないようにするのに役立つものはありますか?

コメント/回答に基づく追加

タスクは同時に実行できます。私はスピードのためにマルチスレッド設計を精査しないことを選択しましたが、まれなタスクの待ち時間に直面して一貫したパフォーマンスを達成するためにそれを検討しています.

私の推測では、Web サービスへの呼び出しは、例外的ではないと見なされていても、完了までに不釣り合いなほど長い時間がかかることがあります。これは、平均実行時間が 1 秒 (さまざまな Web サービス呼び出しのホストを含​​む) で、Web サービスにかかる時間の 0.0001% である場合、たとえば N 個のジョブの合計実行時間に (修正済み) 無視できない影響を与えます。応答するのに15秒。

スレッド プールは、「ワーカー スレッドをスピンアップし、その状態を手動で管理する」という別の言い方ですか? または、複雑さを管理するのに役立つものはありますか? この場合、バグを導入する可能性が利益に比例しなくなるのではないかと心配しています...

スレッド プールに似たものを探していると思いますが、レイテンシが検出されたときにのみ追加のスレッドをスピンアップするものです。

コメントの 1 つが仕事を盗むスレッドと呼ばれるものについて、誰かが私にもっと情報を提供できれば、それは有望に思えます。

私が BackgroundWorker コンポーネントを使用しなかった理由は、必要なワーカーの数がわかっている場合に合わせて構築されているように見えるためです。理想的には設計を柔軟に保ちたいと思います

PS: ありがとうございます。ありがとう!

4

4 に答える 4

3

キュー アイテムの順序がどれほど重要であるか、および次のアイテムが処理される前にアイテムが完了することがどれほど重要かによって異なります。次のアイテムを処理する前に 1 つのアイテムを完全に処理する必要がある場合、基本的に行き詰まります。そうでない場合は、ワーカー スレッドの単純なプールを実装することを決定できます。.NET 4.0 がオプションである場合、そのために Parallel Extensions を使用することをお勧めします。特に、AsParallel() および AsOrdered() メソッドを使用することをお勧めします。

于 2010-09-07T15:33:11.933 に答える
1

ここで探しているのは Backgroundworker のようです。ワーカー スレッドの起動、進行状況の監視、および結果の受信を適切にカプセル化するクラス。http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx。DoWork、ProgressChanged、および RunWorkerCompleted イベントを接続して開始するだけで、すばやく簡単に使用できます。

于 2010-09-07T15:26:08.020 に答える
1

これには、プロデューサー/コンシューマー パターンが最適である可能性があり、( aまたは newQueue<T>でラップされた) キューを使用するのが適切なアプローチです。また、タイムアウトや接続の切断が原因で失敗した Web サービス要求をリサイクルする場所も提供します。lockConcurrentQueue<T>

2 つの同時 Web 接続のデフォルトの最大数を超えて使用する場合は、これを app.config に追加します (「10」を新しい最大数に置き換えます)。

<configuration>
  <system.net>
    <connectionManagement>
      <add address="*" maxconnection="10"/>
    </connectionManagement>
  </system.net>
</configuration>
于 2010-09-07T16:39:19.077 に答える
0

.Net 4 を使用している場合は、Tasks も参照できます。

于 2010-12-22T01:09:13.453 に答える