static IObservable <TResult> AbortableDeferredAsyncRequest <TResult>(Func <AsyncCallback, object, IAsyncResult> begin, Func <IAsyncResult, TResult> end, WebRequest request) { var result = Observable.Create <TResult>(observer => { var isCompleted = -1; var subscription = Observable.FromAsyncPattern <TResult>(begin, ar => { try { Interlocked.Increment(ref isCompleted); return(end(ar)); } catch (WebException ex) { if (ex.Status == WebExceptionStatus.RequestCanceled) { return(default(TResult)); } throw; } })() .Subscribe(observer); return(Disposable.Create(() => { if (Interlocked.Increment(ref isCompleted) == 0) { subscription.Dispose(); request.Abort(); } })); }); return(result); }
private static IObservable <TResult> AbortableDeferredAsyncRequest <TResult>(Func <AsyncCallback, object, IAsyncResult> begin, Func <IAsyncResult, TResult> end, WebRequest request) { return(Observable.Create <TResult>(delegate(IObserver <TResult> observer) { int isCompleted = -1; IDisposable subscription = Observable.FromAsyncPattern <TResult>(begin, delegate(IAsyncResult ar) { TResult result; try { Interlocked.Increment(ref isCompleted); result = end(ar); } catch (WebException ex) { if (ex.Status != WebExceptionStatus.RequestCanceled) { throw; } result = default(TResult); } return result; })().Subscribe(observer); return Disposable.Create(delegate { if (Interlocked.Increment(ref isCompleted) == 0) { subscription.Dispose(); request.Abort(); } }); })); }