internal static IObservable <SocketAsyncEventArgs> InvokeAsync(this SocketAsyncEventArgs eventArgs, Func <SocketAsyncEventArgs, bool> invoke) { Contract.Requires(eventArgs != null); Contract.Requires(invoke != null); Contract.Ensures(Contract.Result <IObservable <SocketAsyncEventArgs> >() != null); var completed = eventArgs.CompletedObservable(); var connection = completed.Connect(); if (invoke(eventArgs)) { return(completed.AsObservable()); } else { connection.Dispose(); return(eventArgs.GetResult()); } }