示例#1
0
        public virtual void RunFor(int fromInclusive, int toExclusive, Action <int> action)
        {
            ThrowIfDisposed();
            if (Working)
            {
                throw new InvalidOperationException(Resources.InvalidOperationException_MultiThreading_CannotStart);
            }
            if (fromInclusive < 0)
            {
                throw ExceptionHelper.CanNotBeLess("fromInclusive", 0);
            }
            if (fromInclusive > toExclusive)
            {
                throw new ArgumentOutOfRangeException("fromInclusive", Resources.ArgumentException_MultiThreading_BegIndexRangeMoreEndIndex);
            }
            if (action == null)
            {
                throw new ArgumentNullException("action");
            }
            int num = toExclusive - fromInclusive;

            if (num != 0)
            {
                int num2 = _threadCount;
                if (num2 > num)
                {
                    num2 = num;
                }
                InitBeforeRun(num2);
                int   num3  = 0;
                int[] array = CalculateThreadsIterations(num, num2);
                try
                {
                    ForParams forParams = default(ForParams);
                    for (int i = 0; i < array.Length; i++)
                    {
                        forParams.Action = action;
                        forParams.Begin  = num3 + fromInclusive;
                        forParams.End    = num3 + array[i] + fromInclusive;
                        StartThread(ForInThread, forParams);
                        num3 += array[i];
                    }
                }
                catch (Exception)
                {
                    EndWork();
                    throw;
                }
            }
        }
示例#2
0
        private void ForInThread(object param)
        {
            ForParams forParams = (ForParams)param;

            try
            {
                do
                {
                    for (int i = forParams.Begin; i < forParams.End; i++)
                    {
                        if (Canceling)
                        {
                            break;
                        }
                        forParams.Action(i);
                    }
                    if (!_enableInfiniteRepeat)
                    {
                        break;
                    }
                    _barrierForReps.SignalAndWait();
                }while (!Canceling);
            }
            catch (Exception)
            {
                Cancel();
                if (_enableInfiniteRepeat)
                {
                    _barrierForReps.RemoveParticipant();
                }
                throw;
            }
            finally
            {
                EndThread();
            }
        }