private MonetaryCycle _CreateCycle(DateTime date) { if (date < this.SourceAccount.StartDate) { throw new Exception("Cannot add a cycle before account generation."); } MonetaryCycle _cycle = null; if (this.MonetaryCycles.Count == 0) { // Opening the account or another initializing event. _cycle = new MonetaryCycle(date); } else { // if the cycle is already registered. _cycle = this._FindCycle(date); // Register new cycle. if (_cycle == null) { decimal _previousClosingBalance = this.MonetaryCycles.Last().ClosingBalance; _cycle = new MonetaryCycle(date, _previousClosingBalance); } } return(_cycle); }
// Cycles are updated when a balance query is set or a transaction is set. public void UpdateCycle(ITransaction transaction) { MonetaryCycle _cycle = this._FindCycle(transaction.Date); if (_cycle == null) { } }
protected MonetaryCycle _FindCycle(DateTime date) { ReaderWriterLockSlim _slimLock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion); _slimLock.EnterReadLock(); MonetaryCycle _cycle = this.MonetaryCycles.FirstOrDefault(x => x.Period.StartDateTime.Date == date.Date); if (_slimLock.IsReadLockHeld) { _slimLock.ExitReadLock(); } return(_cycle); }
protected MonetaryCycle _CreateCycle(DateTime date) { ReaderWriterLockSlim _slimLock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion); _slimLock.TryEnterWriteLock(1000); try { if (date.Date < this.StartDate.Date) { throw new Exception("Cannot add a cycle before account generation."); } MonetaryCycle _cycle = null; if (this.MonetaryCycles.Count == 0) { // Opening the account or another initializing event. _cycle = new MonetaryCycle(date.Date); } else { // if the cycle is already registered. _cycle = this._FindCycle(date); // Register new cycle. if (_cycle == null) { decimal _previousClosingBalance = this.MonetaryCycles.Last().ClosingBalance; _cycle = new MonetaryCycle(date, _previousClosingBalance); } } this.MonetaryCycles.Add(_cycle); //this.AvailableBalance = _cycle.AvailableBalance; return(_cycle); } catch { throw; } finally { if (_slimLock.IsWriteLockHeld) { _slimLock.ExitWriteLock(); } } }