using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Tango.Scripting.Basic { public class ProjectSession where T : IContext { private Action _abortAction; private TaskCompletionSource _completion; public event EventHandler StateChanged; public ProjectSessionState State { get; set; } public Project Project { get; set; } public ProjectSession(Project project, Action abortAction) { _completion = new TaskCompletionSource(); Project = project; _abortAction = abortAction; } public void Abort() { _abortAction(); State = ProjectSessionState.Aborted; _completion.SetException(new OperationCanceledException("Project execution aborted.")); RaiseStateChanged(); } internal void Failed(Exception ex) { State = ProjectSessionState.Failed; _completion.SetException(ex); RaiseStateChanged(null, ex); } internal void Completed(object returnValue) { State = ProjectSessionState.Completed; _completion.SetResult(returnValue); RaiseStateChanged(returnValue, null); } private void RaiseStateChanged(object returnValue = null, Exception ex = null) { StateChanged?.Invoke(this, new ProjectSessionStateChangedEventArgs() { ReturnValue = returnValue, State = State, Exception = ex }); } public Task WaitForCompletion() { return _completion.Task; } } }