public bool MoveCard(MoveCardModel moveCardModel) { bool result = false; Pile sourcePile = Piles.Find(pile => pile.PileNo == moveCardModel.SourcePileNo); Pile targetPile = Piles.Find(pile => pile.PileNo == moveCardModel.TargetPileNo); try { if (Monitor.TryEnter(sourcePile)) { #if DELAY_MOVE if (Monitor.TryEnter(ConcurrencyIssueLock)) { Debug.WriteLine("Paused with move " + moveCardModel.ToString()); Thread.Sleep(5000); Debug.WriteLine("Continueing paused move..."); Monitor.Exit(ConcurrencyIssueLock); } #endif #if BREAK_MOVE } else { Debug.WriteLine("Skipping pause for move " + moveCardModel.ToString()); } { //To match closing bracket #endif if (targetPile != sourcePile) { if (Monitor.TryEnter(targetPile) && validateMove(sourcePile, targetPile, moveCardModel)) { Card cardToMove = sourcePile.RemoveCard(moveCardModel.SourceIndex); targetPile.AddCard(moveCardModel.TargetIndex, cardToMove); sourcePile.VersionNo++; targetPile.VersionNo++; moveCardModel.SourcePileVersionNo = sourcePile.VersionNo; moveCardModel.TargetPileVersionNo = targetPile.VersionNo; result = true; #if BREAK_MOVE Debug.WriteLine("Made move " + moveCardModel.ToString()); #endif } } else //Source and Target pile are the same { if (validateMove(sourcePile, targetPile, moveCardModel)) { Card cardToMove = sourcePile.RemoveCard(moveCardModel.SourceIndex); sourcePile.AddCard(moveCardModel.TargetIndex, cardToMove); sourcePile.VersionNo++; moveCardModel.SourcePileVersionNo = sourcePile.VersionNo; moveCardModel.TargetPileVersionNo = sourcePile.VersionNo; result = true; #if BREAK_MOVE Debug.WriteLine("Made move " + moveCardModel.ToString()); #endif } } } } catch (Exception e) { #if BREAK_MOVE Debug.WriteLine("Excepiton during move " + moveCardModel.ToString()); #endif Debug.WriteLine(e.Message); } finally { if (Monitor.IsEntered(sourcePile)) { Monitor.Exit(sourcePile); } if (Monitor.IsEntered(targetPile)) { Monitor.Exit(targetPile); } } return(result); }