1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- namespace Caliburn.Micro.Core {
- using System;
- using System.Collections.Generic;
- /// <summary>
- /// An implementation of <see cref = "IResult" /> that enables sequential execution of multiple results.
- /// </summary>
- public class SequentialResult : IResult {
- readonly IEnumerator<IResult> enumerator;
- CoroutineExecutionContext context;
- /// <summary>
- /// Initializes a new instance of the <see cref = "SequentialResult" /> class.
- /// </summary>
- /// <param name = "enumerator">The enumerator.</param>
- public SequentialResult(IEnumerator<IResult> enumerator) {
- this.enumerator = enumerator;
- }
- /// <summary>
- /// Occurs when execution has completed.
- /// </summary>
- public event EventHandler<ResultCompletionEventArgs> Completed = delegate { };
- /// <summary>
- /// Executes the result using the specified context.
- /// </summary>
- /// <param name = "context">The context.</param>
- public void Execute(CoroutineExecutionContext context) {
- this.context = context;
- ChildCompleted(null, new ResultCompletionEventArgs());
- }
- void ChildCompleted(object sender, ResultCompletionEventArgs args) {
- var previous = sender as IResult;
- if (previous != null) {
- previous.Completed -= ChildCompleted;
- }
- if(args.Error != null || args.WasCancelled) {
- OnComplete(args.Error, args.WasCancelled);
- return;
- }
- var moveNextSucceeded = false;
- try {
- moveNextSucceeded = enumerator.MoveNext();
- }
- catch(Exception ex) {
- OnComplete(ex, false);
- return;
- }
- if(moveNextSucceeded) {
- try {
- var next = enumerator.Current;
- IoC.BuildUp(next);
- next.Completed += ChildCompleted;
- next.Execute(context);
- }
- catch(Exception ex) {
- OnComplete(ex, false);
- return;
- }
- }
- else {
- OnComplete(null, false);
- }
- }
- void OnComplete(Exception error, bool wasCancelled) {
- enumerator.Dispose();
- Completed(this, new ResultCompletionEventArgs { Error = error, WasCancelled = wasCancelled });
- }
- }
- }
|