public Task PingAsync(double progress, bool sendDuration = true, bool sendOccuredAt = true)
        {
            if (!this.isOpen)
                throw new InvalidOperationException("Session Closed.");

            Ping ping = new Ping();
            ping.SessionId = this.sessionId;
            ping.Progress = progress;

            DateTime current = DateTime.Now;
            if (sendDuration)
                ping.Duration = (current - lastPingTime).Seconds;

            if (sendOccuredAt)
                ping.OccuredAt = XmlConvert.ToString(lastPingTime = current);

            return this.client.PostReadingPingAsync(this.accessToken, this.readingId, ping);
        }
        public Task<string> PostReadingPingAsync(string accessToken, string readingId, Ping ping)
        {
            IDictionary<string, string> parameters = GetInitializedParameterCollection();

            parameters.Add(ReadmillConstants.AccessToken, accessToken);
            parameters.Add(ReadingsClient.ReadingId, readingId);

            var pingUrl = readingsUriTemplates[ReadingsUriTemplateType.ReadingPing].BindByName(this.readmillBaseUri, parameters);

            var wrappedPing = new WrappedPing();
            wrappedPing.Ping = ping;

            return PostAsync<WrappedPing>(wrappedPing, pingUrl);
        }