/// <remarks>Runs on the event loop.</remarks> private void ProcessTaskStateChange(TaskState oldValue, TaskState newValue) { _eventLoop.AssertThread(); if (newValue == TaskState.InProgress) { HasBegun = true; TaskDebug.Verbose($"TW: Observed {Task} starting"); _eventLoop.FireEvent(this, Begin, new TaskEventArgs(Task, newValue)); } else if (newValue == TaskState.Obsolete) { IsObsolete = true; TaskDebug.Verbose($"TW: Observed {Task} get obsolete"); _eventLoop.FireEvent(this, GotObsolete, new TaskEventArgs(Task, newValue)); } else if (newValue == TaskState.Succeeded || newValue == TaskState.Failed || newValue == TaskState.Canceled) { HasEnded = true; TaskDebug.Verbose($"TW: Observed {Task} finished as {newValue}"); _eventLoop.FireEvent(this, End, new TaskEventArgs(Task, newValue)); } }
/// <remarks>Runs on the event loop.</remarks> private void ProcessDependencyStateChange(ITask dep, TaskState oldState, TaskState newState) { _eventLoop.AssertThread(); var depState = newState; if (depState != TaskState.Succeeded && depState != TaskState.Failed && depState != TaskState.Canceled && depState != TaskState.Obsolete) { return; } var notify = false; if (_incompleteDependencies.Contains(dep)) { _incompleteDependencies.Remove(dep); dep.StateChanged -= DependencyStateChangedHandler; if (_incompleteDependencies.Count == 0) { notify = true; } } if (depState == TaskState.Succeeded) { if (notify) { TaskDebug.Verbose($"TW: Observed {dep} succeed -> {Task} got ready"); IsReady = true; _eventLoop.FireEvent(this, GotReady, new TaskEventArgs(Task, TaskState.Waiting)); } } else { TaskDebug.Verbose($"TW: Observed {dep} get {depState} -> {Task} got obsolete"); foreach (var d in _incompleteDependencies) { d.StateChanged -= DependencyStateChangedHandler; } _incompleteDependencies.Clear(); Task.UpdateState(TaskState.Obsolete, depState == TaskState.Failed ? new DependencyFailedException(dep) : null); } }