Exemple #1
0
            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++;
                    }
                }
            }