Пример #1
0
        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);
        }
Пример #2
0
 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();
             }
         });
     }));
 }