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