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
        }
Exemplo n.º 2
0
        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);
        }