public override object WaitForPendingOperationsToComplete(object invocationResult) { var awaitAdapter = AwaitAdapter.FromAwaitable(invocationResult); if (!awaitAdapter.IsCompleted) { var waitStrategy = MessagePumpStrategy.FromCurrentSynchronizationContext(); waitStrategy.WaitForCompletion(awaitAdapter); } // Future: instead of Wait(), use GetAwaiter() to check awaiter.IsCompleted above // and use awaiter.OnCompleted/awaiter.GetResult below. // (Implement a ReflectionAwaitAdapter) try { invocationResult.GetType().GetMethod(TaskWaitMethod, new Type[0]).Invoke(invocationResult, null); } catch (TargetInvocationException e) { IList <Exception> innerExceptions = GetAllExceptions(e.InnerException); ExceptionHelper.Rethrow(innerExceptions[0]); } var args = invocationResult.GetType().GetGenericArguments(); if (args != null && args.Length == 1 && args[0].Name == VoidTaskResultType) { return(null); } PropertyInfo taskResultProperty = invocationResult.GetType().GetProperty(TaskResultProperty, TaskResultPropertyBindingFlags); return(taskResultProperty != null?taskResultProperty.GetValue(invocationResult, null) : invocationResult); }
public static object Await(Func <object> invoke) { Guard.ArgumentNotNull(invoke, nameof(invoke)); using (InitializeExecutionEnvironment()) { var awaitAdapter = AwaitAdapter.FromAwaitable(invoke.Invoke()); if (!awaitAdapter.IsCompleted) { var waitStrategy = MessagePumpStrategy.FromCurrentSynchronizationContext(); waitStrategy.WaitForCompletion(awaitAdapter); } return(awaitAdapter.GetResult()); } }
public static object Await(Func <object> invoke) { Guard.ArgumentNotNull(invoke, nameof(invoke)); object invocationResult; using (InitializeExecutionEnvironment()) { invocationResult = invoke.Invoke(); if (invocationResult == null || !IsTaskType(invocationResult.GetType())) { throw new InvalidOperationException("The delegate did not return a Task."); // General awaitable support coming soon. } var awaitAdapter = AwaitAdapter.FromAwaitable(invocationResult); if (!awaitAdapter.IsCompleted) { var waitStrategy = MessagePumpStrategy.FromCurrentSynchronizationContext(); waitStrategy.WaitForCompletion(awaitAdapter); } } // Future: instead of Wait(), use GetAwaiter() to check awaiter.IsCompleted above // and use awaiter.OnCompleted/awaiter.GetResult below. // (Implement a ReflectionAwaitAdapter) try { invocationResult.GetType().GetMethod(TaskWaitMethod, new Type[0]).Invoke(invocationResult, null); } catch (TargetInvocationException e) { IList <Exception> innerExceptions = GetAllExceptions(e.InnerException); ExceptionHelper.Rethrow(innerExceptions[0]); } var genericArguments = invocationResult.GetType().GetGenericArguments(); if (genericArguments.Length == 1 && genericArguments[0].Name == VoidTaskResultType) { return(null); } PropertyInfo taskResultProperty = invocationResult.GetType().GetProperty(TaskResultProperty, TaskResultPropertyBindingFlags); return(taskResultProperty != null?taskResultProperty.GetValue(invocationResult, null) : invocationResult); }