private static async Task MonitorAsyncStatus()

in Source/Internal/ServiceHelper.cs [559:613]


        private static async Task<AsyncStatus> MonitorAsyncStatus(Uri statusUrl, int failedTries, Action<int> remainingTimeCallback)
        {
            AsyncStatus status = null;

            try
            {
                using (var rs = await ServiceHelper.GetStreamAsync(statusUrl).ConfigureAwait(false))
                {
                    var r = ServiceHelper.DeserializeStream<Response>(rs);

                    if (r != null)
                    {
                        if (r.ErrorDetails != null && r.ErrorDetails.Length > 0)
                        {
                            throw new Exception(r.ErrorDetails[0]);
                        }
                        else if (r.ResourceSets != null && r.ResourceSets.Length > 0 && r.ResourceSets[0].Resources != null && r.ResourceSets[0].Resources.Length > 0 && r.ResourceSets[0].Resources[0] is AsyncStatus)
                        {
                            status = r.ResourceSets[0].Resources[0] as AsyncStatus;

                            if (!status.IsCompleted && status.CallbackInSeconds > 0)
                            {
                                remainingTimeCallback?.Invoke(status.CallbackInSeconds);

                                //Wait remaining seconds.
                                await Task.Delay(TimeSpan.FromSeconds(status.CallbackInSeconds)).ConfigureAwait(false);
                                return await MonitorAsyncStatus(statusUrl, 0, remainingTimeCallback).ConfigureAwait(false);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                //Check to see how many times the status check has failed consecutively.
                if (failedTries < MaxStatusCheckRetries)
                {
                    //Wait some time and try again.
                    await Task.Delay(TimeSpan.FromSeconds(StatusCheckRetryDelay)).ConfigureAwait(false);
                    return await MonitorAsyncStatus(statusUrl, failedTries + 1, remainingTimeCallback).ConfigureAwait(false);
                }
                else
                {
                    status = new AsyncStatus()
                    {
                        ErrorMessage = "Failed to get status, and exceeded the maximium of " + MaxStatusCheckRetries + " retries. Error message: " + ex.Message,
                        CallbackInSeconds = -1,
                        IsCompleted = false
                    };
                }
            }

            //Should only get here is the request has completed, was not accepted or there was an error.
            return status;
        }