1

ThreadPool.QueueWorkItem メソッドがどのように機能するかを理解しようとしています。しかし、それがどのように機能しているのか理解できませんでした。

ThreadPool をテストする簡単な例を作成します。このコードを実行すると、すぐにループして Thread.Sleep() 行で停止します。では、ThreadPool はここで何をしますか。10000 メソッドを内部コレクションに保存してから、非同期で実行しますか。(いくつかの計算によると、内部的にスレッド数は何でもかまいません=>これは私が知っていることです)

  1. キューがある場合 (あるはず)、キューで待機しているアイテム (メソッド) の数を取得できますか?

2.例では WriteLine メソッドは単純ですが、私の実際のアプリケーションでは、50000 個のアイテムをループして、配列内の各アイテムに対してデータベースの選択/挿入/更新 vb.. を呼び出す Web サービス メソッドを使用しています。この種のことをそのようにすることは可能ですか?

class Program
{
    static void Main(string[] args)
    {
        new Program().Looper();
    }

    public void Looper()
    {
        for (int i = 0; i < 10000; i++)
        {
            ThreadPool.QueueUserWorkItem(WriteLine, i);
        }

        Thread.Sleep(10000);
    }

    public void WriteLine(object str)
    {
        Debug.WriteLine((int)str);
    }
}
4

2 に答える 2

2

1) キューがある場合 (あるはずです)、キューで待機しているアイテム (メソッド) の数を取得できますか?

はい、キューがあり、いいえ、それを見ることはできません。これは ThreadPool の実装の詳細であり、実際には何もできません。

2.例では、WriteLine メソッドは単純ですが、実際のアプリケーションでは、50000 個のアイテムをループして、配列内の各アイテムに対してデータベースの選択/挿入/更新 vb.. を呼び出す Web サービス メソッドを使用しています。この種のことをそのようにすることは可能ですか?

はい。プールされた実行には外部リソースの待機が多く含まれるため、プールされた実行に適しているように思えます。とはいえ、.NET 4.0 以降を使用している場合は、自分でスレッドプールにアクセスする代わりにTPLを確認することをお勧めします。TPL は、ThreadPool では得られないタスクのネストや継続などの機能を提供します。また、非同期パターンとネイティブに統合されるため、非同期 I/O 並列処理が改善されます。

于 2012-07-25T18:20:41.263 に答える
0

アイテムをキューに入れるときは、int カウンターをインクリメントし、プロセスの実行が終了したら (非同期プロセスの完了時に関数をデリゲート実行できると思います)、その int カウンターをデクリメントすると、待機中のスレッドの数がわかります。実行します。Thread.Sleep は何も保存しません。それ以降のプロセスがその非同期プロセスに入るのを単に停止します。

于 2012-07-25T18:20:25.787 に答える