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