public void AddLocalUser(XboxLiveUser user)
        {
            if (user == null)
            {
                throw new ArgumentException("user");
            }

            string xboxUserId = user.XboxUserId;

            if (this.userStatContextMap.ContainsKey(xboxUserId))
            {
                throw new ArgumentException("User already in map");
            }

            var context = new StatsUserContext();

            this.userStatContextMap.Add(xboxUserId, context);

            var xboxLiveContext = new XboxLiveContext(user);
            var statsService    = new StatsService(xboxLiveContext);

            context.xboxLiveContext    = xboxLiveContext;
            context.statsService       = statsService;
            context.user               = user;
            context.statsValueDocument = new StatsValueDocument(null);

            statsService.GetStatsValueDocument().ContinueWith(statsValueDocTask =>
            {
                lock (this.userStatContextMap)
                {
                    if (user.IsSignedIn)
                    {
                        if (statsValueDocTask.IsCompleted)
                        {
                            if (this.userStatContextMap.ContainsKey(xboxUserId))
                            {
                                this.userStatContextMap[xboxUserId].statsValueDocument             = statsValueDocTask.Result;
                                this.userStatContextMap[xboxUserId].statsValueDocument.FlushEvent += (sender, e) =>
                                {
                                    if (this.userStatContextMap.ContainsKey(xboxUserId))
                                    {
                                        this.FlushToService(this.userStatContextMap[xboxUserId]);
                                    }
                                };
                            }
                        }
                    }
                }

                this.AddEvent(new StatEvent(StatEventType.LocalUserAdded, user, statsValueDocTask.Exception, new StatEventArgs()));
            });
        }
        private StatsManager()
        {
            this.userDocumentMap = new Dictionary <string, StatsValueDocument>();
            this.eventList       = new List <StatEvent>();

            this.statTimer            = new CallBufferTimer <XboxLiveUser>(TimePerCall);
            this.statTimer.Completed += this.TimerCompleteCallback;

            this.statPriorityTimer            = new CallBufferTimer <XboxLiveUser>(TimePerCall);
            this.statPriorityTimer.Completed += this.TimerCompleteCallback;

            this.statsService       = new StatsService();
            this.leaderboardService = new LeaderboardService();

            RunFlushTimer();
        }