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