11

QueueClient.OnMessage メソッドは、常に別のスレッドでコールバック パラメータを実行しますか?

MaxConcurrentCalls が 10 に設定されている場合、queueClient はメッセージを並列処理するために最大 10 個のスレッドをスピンアップすると想定しています。MaxConcurrentConnection 値 1 を渡すと、新しいスレッドが作成されますか?それとも現在のスレッドで実行されますか?

私の実際の問題:
ワーカー ロール内で、複数のキューを処理したいのですが、それらをすべて同時に処理させたいと考えています。例えば

        _queueClient1.OnMessage(x =>
        {
            // Do something
        }, new OnMessageOptions { MaxConcurrentCalls = 1});

        _queueClient2.OnMessage(x =>
        {
            // Do something
        }, new OnMessageOptions { MaxConcurrentCalls = 1 });

        _queueClient3.OnMessage(x =>
        {
            // Do something
        }, new OnMessageOptions { MaxConcurrentCalls = 1 });

        _queueClient4.OnMessage(x =>
        {
            // Do something
        }, new OnMessageOptions { MaxConcurrentCalls = 1 });

これにより、_queueClient4 コールバックが実行前に _queueClient2 の終了を待たないように、各コールバックが並行して実行されることになりますか?

4

1 に答える 1

11

コールバックを登録するOnMessageと、別のスレッドで呼び出されます。10 に設定MaxConcurrentCallsすると、10 個のメッセージに対して 10 個のスレッドが作成され、メッセージごとにこれらすべてが同時にコールバックされます。上に示したように、キュー全体でこれを行うこともできますが、もちろん、個々のコールバック処理間で同期や順序付けは行われません。

新しいスレッドでコールバックを呼び出すと、メソッドが完了するか例外がスローされるまで、その特定の実行/メッセージに対して同期され、メッセージ処理は完了しません。が 0 の場合MaxConcurrentCalls、登録されたコールバックごとに 1 つのスレッドのみが処理されます。ただし、異なる QueueClient インスタンスがある場合は、異なるコールバックをそれらに登録したり、同じコールバックを異なる同時カウントなどで登録したりできます。

于 2013-08-15T20:50:31.477 に答える