private IEnumerator MaintainAccessToken()
        {
            TimeSpan refreshBackoff = TimeSpan.FromSeconds(10);
            var      rand           = new Random();

            while (true)
            {
                if (refreshBackoff >= OauthLoginSession.MaxBackoffInterval)
                {
                    yield break;
                }

                if (this.tokenData == null || DateTime.UtcNow < this.nextRefreshTime)
                {
                    yield return(new WaitForSeconds(OauthLoginSession.WaitExpiryDelay / 1000f));

                    continue;
                }

                Result <TokenData> refreshResult = null;

                yield return(RefreshToken(result => refreshResult = result));

                if (!refreshResult.IsError)
                {
                    this.nextRefreshTime = OauthLoginSession.ScheduleNormalRefresh(this.tokenData.expires_in);
                }
                else
                {
                    refreshBackoff = OauthLoginSession.CalculateBackoffInterval(refreshBackoff, rand.Next(1, 60));

                    this.nextRefreshTime = DateTime.UtcNow + refreshBackoff;
                }
            }
        }