Ejemplo n.º 1
0
        private static Task <HttpWebResponse> GetResponseWithRetryAsync(IHiggsRequest higgsRequest, int retries)
        {
            if (retries < 0)
            {
                throw new ArgumentOutOfRangeException("Invalid number of retries to make.");
            }

            Func <Task <WebResponse>, Task <HttpWebResponse> > proceedToNextStep = null;

            Func <Task <HttpWebResponse> > doStep = () =>
            {
                try
                {
                    WebRequest         request = higgsRequest.GetRequest();
                    Task <WebResponse> ds      = Task.Factory.FromAsync <WebResponse>(
                        request.BeginGetResponse,
                        request.EndGetResponse,
                        null
                        );
                    return(ds.ContinueWith(proceedToNextStep).Unwrap());
                }
                catch (IOException e)
                {
                    return(proceedToNextStep(null)); //Something to do with Mono SSL occasionally breaking down
                }
            };

            proceedToNextStep = prevTask =>
            {
                if (prevTask == null)
                {
                    if (--retries <= 0)
                    {
                        throw new Exception(
                                  "There seems to be an issue with the connection to Binder. Please retry again later.");
                    }
                    return(doStep());
                }
                if (prevTask.IsCanceled)
                {
                    throw new TaskCanceledException();
                }
                if (prevTask.IsFaulted && --retries > 0)
                {
                    return(doStep());
                }

                var tcs = new TaskCompletionSource <HttpWebResponse>();
                try
                {
                    tcs.SetResult((HttpWebResponse)prevTask.Result);
                }
                catch (AggregateException ex)
                {
                    if (--retries > 0)
                    {
                        return(doStep());
                    }
                    throw new HiggsClientException("The request has failed to process. Please try again", ex);
                }
                return(tcs.Task);
            };
            return(doStep());
        }
Ejemplo n.º 2
0
        private static Task<HttpWebResponse> GetResponseWithRetryAsync(IHiggsRequest higgsRequest, int retries)
        {
            if (retries < 0)
                throw new ArgumentOutOfRangeException("Invalid number of retries to make.");

            Func<Task<WebResponse>, Task<HttpWebResponse>> proceedToNextStep = null;

            Func<Task<HttpWebResponse>> doStep = () =>
            {
                try
                {
                    WebRequest request = higgsRequest.GetRequest();
                    Task<WebResponse> ds = Task.Factory.FromAsync<WebResponse>(
                        request.BeginGetResponse,
                        request.EndGetResponse,
                        null
                        );
                    return ds.ContinueWith(proceedToNextStep).Unwrap();
                }
                catch (IOException e)
                {
                    return proceedToNextStep(null); //Something to do with Mono SSL occasionally breaking down
                }
            };

            proceedToNextStep = prevTask =>
            {
                if (prevTask == null)
                {
                    if (--retries <= 0)
                    {
                        throw new Exception(
                            "There seems to be an issue with the connection to Binder. Please retry again later.");
                    }
                    return doStep();
                }
                if (prevTask.IsCanceled)
                    throw new TaskCanceledException();
                if (prevTask.IsFaulted && --retries > 0)
                    return doStep();

                var tcs = new TaskCompletionSource<HttpWebResponse>();
                try
                {
                    tcs.SetResult((HttpWebResponse) prevTask.Result);
                }
                catch (AggregateException ex)
                {
                    if (--retries > 0)
                        return doStep();
                    throw new HiggsClientException("The request has failed to process. Please try again", ex);
                }
                return tcs.Task;
            };
            return doStep();
        }