1

計算量の多いデータバインドプロセスを実行する統合サービスがあります。同時に実行されているこれらのプロセスが、n = 5(ただし、nは構成可能で、実行時に変更可能)になることはありません。アイデアは、サーバーの負荷を安全なレベルに抑えることです。このメソッドで処理されるデータの量はバッチ処理によって制限されるため、1つのプロセスが別のプロセスよりもはるかに大きな負荷を表すことを心配する必要はありません。

処理メソッドは別のプロセスによって呼び出され、ペイロールを実行するリクエストはキューに保持されます。その時点でロジックを挿入して、このリクエストを今すぐ処理するか、キューに残すかを決定できます。

そのため、処理メソッドと同じサービスに別のメソッドが必要です。これにより、サーバーが処理メソッドへの別の呼び出しを受け入れることができるかどうかを知ることができます。「何回の給与計算が行われているのですか?それはn未満ですか?」と尋ねられます。これを達成するためのきちんとした方法は何ですか?

- - - - - -編集 - - - - - -

明確にする必要があると思います。リクエストをキューから削除するかどうかを決定するプロセスは、WCF境界によって給与データを処理するサービスから分離されています。給与処理プロセスでスレッドを停止しても、それ以上のリクエストが届くのを防ぐことはできません。

4

4 に答える 4

4

これを行うには、を使用できますSemaphore

public class Foo
{
    private Semaphore semaphore;
    public Foo(int numConcurrentCalls)
    {
        semaphore = new Semaphore(numConcurrentCalls, numConcurrentCalls);
    }

    public bool isReady()
    {
        return semaphore.WaitOne(0);
    }

    public void Bar()
    {
        try
        {
            semaphore.WaitOne();//it will only get past this line if there are less than 
            //"numConcurrentCalls" threads in this method currently.
            //do stuff
        }
        finally
        {
            semaphore.Release();
        }
    }
}
于 2012-12-14T14:53:36.197 に答える
1

オブジェクトプールパターンを確認します。これはあなたが説明していることです。パターンで厳密に要求されるわけではありませんが、現在プール内にあるオブジェクトの数、最大(構成済み)数、最高水準点などを公開できます。

于 2012-12-14T14:25:07.613 に答える
0
void ThreadTest()
{
    ConcurrentQueue<int> q = new ConcurrentQueue<int>();
    int MaxCount = 5;
    Random r = new Random();

    for (int i = 0; i <= 10000; i++)
    {
        q.Enqueue(r.Next(100000, 200000));
    }

    ThreadStart proc = null;
    proc = () =>
    {
        int read = 0;
        if (q.TryDequeue(out read))
        {
            Console.WriteLine(String.Format("[{1:HH:mm:ss}.{1:fff}] starting: {0}... @Thread {2}", read, DateTime.Now, Thread.CurrentThread.ManagedThreadId));
            Thread.Sleep(r.Next(100, 1000));
            Console.WriteLine(String.Format("[{1:HH:mm:ss}.{1:fff}] {0} ended! @Thread {2}", read, DateTime.Now, Thread.CurrentThread.ManagedThreadId));
            proc();
        }
    };

    for (int i = 0; i <= MaxCount; i++)
    {
        new Thread(proc).Start();
    }
}
于 2012-12-14T14:48:17.590 に答える
0

コレクション内の各アイテムが同時呼び出しの1つを表すBlockingCollectionが必要になると思います。

IProducerConsumerCollectionも参照してください。

スレッドを使用しているだけの場合は、スレッドの同時実行性を制限するためのメソッド(たとえば、TaskScheduler.MaximumConcurrencyLevelプロパティとこの例)を確認することをお勧めします。

ParallelEnumerable.WithDegreeOfParallelismも参照してください

于 2012-12-14T14:24:00.203 に答える