我在我的系統中有很多「長期運行但未綁定CPU」的「作業」。我想設置一個Worker角色來處理這些角色,但它們具有足夠的可擴展性,以至於一個Worker角色可以輕鬆地擁有10-20個線程同時處理「作業」。如何在Worker中設置多個線程並向其發送消息?
這裏有一些問題建議使用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);
}
}
然後在該線程刪除完成的消息。基本上我試圖將一個Worker分成20個「實例」,而不會失去太多的Azure功能(特別是我希望隊列消息超時/重試功能)。
我對.NET線程並不熟悉,對此有什麼最好的方法呢?
編輯:哇,我完全忘了補充一個重要的觀點:這需要跨越多個工作人員。所以,10個Worker角色,每個都有10個線程,消息被UI前端排隊,然後由第一個Worker以一個空閒線程出列並運行。
只是所有作業添加到線程池,讓它把剩下的事情。它將管理日程安排,創建線程等。除非您能證明讓系統處理它是個問題,否則我不會再煩心了。這樣的事情令人驚訝。 – Servy
我是個笨蛋,相關信息已添加到問題中。對不起 – Stevoman
不改變我的答案。只需將您擁有的所有任務放入線程池並讓它處理即可。很有可能它會比你更有效地安排它們,它會爲你節省甚至嘗試的努力。 – Servy