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; } } }
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(); } }