protected override Task <T> AwaitForResult <T>(AsyncOperationCallback <T> asyncOperationCallback) #endif { #if ASYNC Task <T> operationTask = asyncOperationCallback.Task; Task <Exception> disconnectionTask = mDisconnectionTaskCompletionSource.Task; Task task = await Task.WhenAny(operationTask, disconnectionTask) .ConfigureAwait(false); if (!operationTask.IsCompleted) { Exception exception = await disconnectionTask.ConfigureAwait(false); asyncOperationCallback.SetException(exception); } T result = await operationTask.ConfigureAwait(false); return(result); #else IObservable <T> merged = Observable.Amb (asyncOperationCallback.Task.ToObservable(), mDisconnectionTaskCompletionSource.Task.ToObservable() .SelectMany(x => Observable.Throw <T>(x))); Task <T> task = merged.ToTask(); return(task); #endif }
protected override async Task <T> AwaitForResult <T>(AsyncOperationCallback <T> asyncOperationCallback, CancellationTokenRegistration registration) { Task <T> operationTask = asyncOperationCallback.Task; Task <Exception> disconnectionTask = mDisconnectionTaskCompletionSource.Task; Task task = await Task.WhenAny(operationTask, disconnectionTask) .ConfigureAwait(false); registration.Dispose(); if (!operationTask.IsCompleted) { Exception exception = await disconnectionTask.ConfigureAwait(false); asyncOperationCallback.SetException(exception); } T result = await operationTask.ConfigureAwait(false); return(result); }