私のシステムには、長時間実行されているがCPUにバインドされていない「ジョブ」がたくさんあります。これらを処理するためにワーカーロールを設定したいのですが、1つのワーカーロールで10〜20のスレッドをすべて同時に処理することができるように、十分にスケーラブルです。
ここにTPLの使用を提案する質問がありますが、これについては限られた経験しかありません。ただし、スレッドの数が最大になるようにスレッドを管理する方法と、スレッドが解放されたときにスレッドをディスパッチする方法がわかりません。
これを少し複雑にしているのは、各「ジョブ」が必要とするサービスを作成するためにNinjectを使用したいということです。
これが私の頭の中で機能していることをイメージする方法です:
while (true)
{
// Don't go unless we have a free slot (how do I implement this?!)
if (FreeThreadExists)
{
// Get the next message
CloudQueueMessage ThisMessage = Queue.GetMessage(TimeSpan.FromMinutes(3));
// Get the new job and inject services
Job MyJob = Kernel.Get<Job>();
// Start this job
// Will I need to keep ahold of this Task?
// And how do I know when it's done so that FreeThreadExists changes?
Task.Factory.StartNew(() => MyJob.Run(ThisMessage));
}
else
{
// Sleep to prevent choking
Thread.Sleep(500);
}
}
次に、そのスレッドで、完了時にメッセージを削除します。基本的に、Azureの機能をあまり失うことなく、1つのワーカーを20の「インスタンス」に分割しようとしています(具体的には、キューメッセージのタイムアウト/再試行機能が必要です)。
私は.NETスレッドにかなり不慣れですが、これを実行するための最良の方法は何ですか?
編集:うわー、私は重要なポイントを追加するのを完全に忘れました:これは複数のワーカーにまたがってスケーリングする必要があります。したがって、それぞれ10個のスレッドを持つ10個のワーカーロールのメッセージは、UIフロントエンドによってキューに入れられ、次にキューから取り出されて、空きスレッドを持つ最初のワーカーによって実行されます。