private void ThreadMethod() { actions = new List <Action>(); CancellationToken tok = cts.Token; Action[] arrActions = new Action[0]; int x = 0, f = 0; while (!tok.IsCancellationRequested) { if (ActionsChanged) { lock (Tenants) { ActionsChanged = false; actions.Clear(); f = Tenants.Count; if (f == 0) { zero = true; many = false; return; } if (f == 1) { zero = false; many = false; } else { zero = false; many = true; for (x = 0; x < f; x++) { IDistributable t = Tenants[x]; if (workRepeat > 1) { actions.Add(() => { for (int r = 1; r <= workRepeat; r++) { t.DoWork(); if (r == workRepeat) { break; } if (workIdleSleepTime < 0) { continue; } Thread.Sleep(workIdleSleepTime); } }); } else { if (workIdleSleepTime < 0) { actions.Add(t.DoWork); } else { actions.Add(() => { t.DoWork(); Thread.Sleep(workIdleSleepTime); }); } } } } f = 0; arrActions = actions.ToArray(); continue; } } lock (lockObj) { if (Tenants.Count == 0) { Thread.Sleep(5); } else if (many) { Parallel.Invoke(arrActions); if (sleepDivisor < 0) { continue; } } else { Tenants[0].DoWork(); } } if (f == sleepDivisor) { Thread.Sleep(idleSleepTime); f = 0; } else { f++; } } }