コード例 #1
0
        /// <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));
            }
        }
コード例 #2
0
        /// <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);
            }
        }