1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- namespace Caliburn.Micro.Core {
- using System;
- using System.Collections.Generic;
- using System.Threading.Tasks;
- /// <summary>
- /// Manages coroutine execution.
- /// </summary>
- public static class Coroutine {
- static readonly ILog Log = LogManager.GetLog(typeof(Coroutine));
- /// <summary>
- /// Creates the parent enumerator.
- /// </summary>
- public static Func<IEnumerator<IResult>, IResult> CreateParentEnumerator = inner => new SequentialResult(inner);
- /// <summary>
- /// Executes a coroutine.
- /// </summary>
- /// <param name="coroutine">The coroutine to execute.</param>
- /// <param name="context">The context to execute the coroutine within.</param>
- /// /// <param name="callback">The completion callback for the coroutine.</param>
- public static void BeginExecute(IEnumerator<IResult> coroutine, CoroutineExecutionContext context = null, EventHandler<ResultCompletionEventArgs> callback = null) {
- Log.Info("Executing coroutine.");
- var enumerator = CreateParentEnumerator(coroutine);
- IoC.BuildUp(enumerator);
- if (callback != null) {
- ExecuteOnCompleted(enumerator, callback);
- }
- ExecuteOnCompleted(enumerator, Completed);
- enumerator.Execute(context ?? new CoroutineExecutionContext());
- }
- /// <summary>
- /// Executes a coroutine asynchronous.
- /// </summary>
- /// <param name="coroutine">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(IEnumerator<IResult> coroutine, CoroutineExecutionContext context = null) {
- var taskSource = new TaskCompletionSource<object>();
- BeginExecute(coroutine, context, (s, e) => {
- if (e.Error != null)
- taskSource.SetException(e.Error);
- else if (e.WasCancelled)
- taskSource.SetCanceled();
- else
- taskSource.SetResult(null);
- });
- return taskSource.Task;
- }
- static void ExecuteOnCompleted(IResult result, EventHandler<ResultCompletionEventArgs> handler) {
- EventHandler<ResultCompletionEventArgs> onCompledted = null;
- onCompledted = (s, e) => {
- result.Completed -= onCompledted;
- handler(s, e);
- };
- result.Completed += onCompledted;
- }
- /// <summary>
- /// Called upon completion of a coroutine.
- /// </summary>
- public static event EventHandler<ResultCompletionEventArgs> Completed = (s, e) => {
- if(e.Error != null) {
- Log.Error(e.Error);
- }
- else if(e.WasCancelled) {
- Log.Info("Coroutine execution cancelled.");
- }
- else {
- Log.Info("Coroutine execution completed.");
- }
- };
- }
- }
|