| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 | 
							- namespace Caliburn.Micro.Core {
 
-     using System;
 
-     using System.Threading.Tasks;
 
-     /// <summary>
 
-     /// Extension methods to bring <see cref="System.Threading.Tasks.Task"/> and <see cref="Caliburn.Micro.IResult"/> together.
 
-     /// </summary>
 
-     public static class TaskExtensions {
 
-         /// <summary>
 
-         /// Executes an <see cref="Caliburn.Micro.IResult"/> asynchronous.
 
-         /// </summary>
 
-         /// <param name="result">The coroutine to execute.</param>
 
-         /// <param name="context">The context to execute the coroutine within.</param>
 
-         /// <returns>A task that represents the asynchronous coroutine.</returns>
 
-         public static Task ExecuteAsync(this IResult result, CoroutineExecutionContext context = null) {
 
-             return InternalExecuteAsync<object>(result, context);
 
-         }
 
-         /// <summary>
 
-         /// Executes an <see cref="Caliburn.Micro.IResult<TResult>"/> asynchronous.
 
-         /// </summary>
 
-         /// <typeparam name="TResult">The type of the result.</typeparam>
 
-         /// <param name="result">The coroutine to execute.</param>
 
-         /// <param name="context">The context to execute the coroutine within.</param>
 
-         /// <returns>A task that represents the asynchronous coroutine.</returns>
 
-         public static Task<TResult> ExecuteAsync<TResult>(this IResult<TResult> result,
 
-                                                           CoroutineExecutionContext context = null) {
 
-             return InternalExecuteAsync<TResult>(result, context);
 
-         }
 
-         static Task<TResult> InternalExecuteAsync<TResult>(IResult result, CoroutineExecutionContext context) {
 
-             var taskSource = new TaskCompletionSource<TResult>();
 
-             EventHandler<ResultCompletionEventArgs> 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<TResult>;
 
-                     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;
 
-         }
 
-         /// <summary>
 
-         /// Encapsulates a task inside a couroutine.
 
-         /// </summary>
 
-         /// <param name="task">The task.</param>
 
-         /// <returns>The coroutine that encapsulates the task.</returns>
 
-         public static TaskResult AsResult(this Task task) {
 
-             return new TaskResult(task);
 
-         }
 
-         /// <summary>
 
-         /// Encapsulates a task inside a couroutine.
 
-         /// </summary>
 
-         /// <typeparam name="TResult">The type of the result.</typeparam>
 
-         /// <param name="task">The task.</param>
 
-         /// <returns>The coroutine that encapsulates the task.</returns>
 
-         public static TaskResult<TResult> AsResult<TResult>(this Task<TResult> task) {
 
-             return new TaskResult<TResult>(task);
 
-         }
 
-     }
 
- }
 
 
  |