| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 | namespace Caliburn.Micro.Core {    using System;    using System.Threading.Tasks;    /// <summary>    /// A couroutine that encapsulates an <see cref="System.Threading.Tasks.Task"/>.    /// </summary>    public class TaskResult : IResult {        readonly Task innerTask;        /// <summary>        /// Initializes a new instance of the <see cref="TaskResult"/> class.        /// </summary>        /// <param name="task">The task.</param>        public TaskResult(Task task) {            innerTask = task;        }        /// <summary>        /// Executes the result using the specified context.        /// </summary>        /// <param name="context">The context.</param>        public void Execute(CoroutineExecutionContext context) {            if (innerTask.IsCompleted)                OnCompleted(innerTask);            else                innerTask.ContinueWith(OnCompleted,                    System.Threading.SynchronizationContext.Current != null                        ? TaskScheduler.FromCurrentSynchronizationContext()                        : TaskScheduler.Current);        }        /// <summary>        /// Called when the asynchronous task has completed.        /// </summary>        /// <param name="task">The completed task.</param>        protected virtual void OnCompleted(Task task) {            Completed(this, new ResultCompletionEventArgs {WasCancelled = task.IsCanceled, Error = task.Exception});        }        /// <summary>        /// Occurs when execution has completed.        /// </summary>        public event EventHandler<ResultCompletionEventArgs> Completed = delegate { };    }    /// <summary>    /// A couroutine that encapsulates an <see cref="System.Threading.Tasks.Task<TResult>"/>.    /// </summary>    /// <typeparam name="TResult">The type of the result.</typeparam>    public class TaskResult<TResult> : TaskResult, IResult<TResult> {        /// <summary>        /// Initializes a new instance of the <see cref="TaskResult{TResult}"/> class.        /// </summary>        /// <param name="task">The task.</param>        public TaskResult(Task<TResult> task)            : base(task) {        }        /// <summary>        /// Gets the result of the asynchronous operation.        /// </summary>        public TResult Result { get; private set; }        /// <summary>        /// Called when the asynchronous task has completed.        /// </summary>        /// <param name="task">The completed task.</param>        protected override void OnCompleted(Task task) {            if (!task.IsFaulted && !task.IsCanceled)                Result = ((Task<TResult>) task).Result;            base.OnCompleted(task);        }    }}
 |