2

Webサービスの負荷テストに使用しようとしてBackgroundWorkerいます。コードは次のとおりです。

    private void button1_Click(object sender, EventArgs e)
    {
        CheckWS("11111");
        CheckWS("22222");
        CheckWS("3344111");
        // .. and some more of those, approx 1000
    }

    public void CheckWS(string sUser)
    {
        BackgroundWorker bgWork = new BackgroundWorker();

        bgWork.DoWork += new DoWorkEventHandler(bgWork_DoWork);

        sObject sData = new sObject();
        sData.iNum = iCount++;
        sData.sId = sUser;
        bgWork.RunWorkerAsync(sData);
    }

    public void bgWork_DoWork(object sender, DoWorkEventArgs e)
    {
        // Update a textbox that this worker started
        ...
        // Run a web service
        ...
        // Update the textbox as worker ended
    }

しかし、仕事にかかった時間と、ワーカーの出力(テキストボックスでのワーカーの開始と終了)によると、各ワーカーが開始するには時間がかかりすぎます-

すべてが同時に実行されることを期待しますが、代わりに、一度に2〜3のバックグラウンドワーカーしか実行しません...

この問題に関するアイデアはありますか?

4

2 に答える 2

3

バックグラウンドワーカーはThreadPoolの上で実行され、TPは意図的にスレッドの数を制限します。

これはTest(-driver)アプリなので、プールの構成を変更しても問題はありません。スレッドの最小数を適切なものに設定できます。

   ThreadPool.SetMinThreads(20, 20);
于 2012-07-04T08:41:46.233 に答える
1

BackgroundWorkerクラスがスレッドプールを使用していることを示す@HenkHoltermanの正解の背景を説明します...

スレッドプールは、そのプール内の1つのスレッドで開始され、プールマネージャーは、制限された最大値まで、余分な非同期ワークロードに対処するために新しいスレッドを「注入」します。設定された非アクティブ期間の後、プールマネージャーは、そうすることでスループットが向上すると「考えた」場合、スレッドを「リタイア」することがあります。上記の場合、プールマネージャーは同時スレッドの数を制限しています。

を呼び出すことにより、プールが作成するスレッド数の上限を設定できますThread.Pool.SetMaxThread;。デフォルトは次のとおりです。

1023 in Framework 4.0 in a 32-bit environment.
32768 in Framework 4.0 in a 64-bit environment.
250 per core in Framework 3.5.
25 per core in Framework 2.0.

[_これらの数値は、ハードウェアおよびOSによって異なる場合があります]。これらの膨大な数の理由(少なくとも.NET 4.0の場合)は、一部のスレッドがブロックされている場合(集中的な作業の実行など)でも確実に進行するようにするためです。

下限は。で設定できますThreadPool.SetMinThreads。このリミッターの役割は、最大リミッターの役割よりも微妙です。これにより、プールマネージャーは、この数の下限に達するまでスレッドの作成を遅らせないように指示されます。この数を@Henkが正しく指摘したように設定すると、同時実行性が向上します。ブロックされたスレッドがあります。

これがお役に立てば幸いです。

于 2012-07-04T09:03:59.653 に答える