namespace Caliburn.Micro.Core { using System; using System.Threading.Tasks; /// /// Extension methods to bring and together. /// public static class TaskExtensions { /// /// Executes an asynchronous. /// /// The coroutine to execute. /// The context to execute the coroutine within. /// A task that represents the asynchronous coroutine. public static Task ExecuteAsync(this IResult result, CoroutineExecutionContext context = null) { return InternalExecuteAsync(result, context); } /// /// Executes an asynchronous. /// /// The type of the result. /// The coroutine to execute. /// The context to execute the coroutine within. /// A task that represents the asynchronous coroutine. public static Task ExecuteAsync(this IResult result, CoroutineExecutionContext context = null) { return InternalExecuteAsync(result, context); } static Task InternalExecuteAsync(IResult result, CoroutineExecutionContext context) { var taskSource = new TaskCompletionSource(); EventHandler completed = null; completed = (s, e) => { result.Completed -= completed; if (e.Error != null) taskSource.SetException(e.Error); else if (e.WasCancelled) taskSource.SetCanceled(); else { var rr = result as IResult; taskSource.SetResult(rr != null ? rr.Result : default(TResult)); } }; try { IoC.BuildUp(result); result.Completed += completed; result.Execute(context ?? new CoroutineExecutionContext()); } catch (Exception ex) { result.Completed -= completed; taskSource.SetException(ex); } return taskSource.Task; } /// /// Encapsulates a task inside a couroutine. /// /// The task. /// The coroutine that encapsulates the task. public static TaskResult AsResult(this Task task) { return new TaskResult(task); } /// /// Encapsulates a task inside a couroutine. /// /// The type of the result. /// The task. /// The coroutine that encapsulates the task. public static TaskResult AsResult(this Task task) { return new TaskResult(task); } } }