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