public void Remove(ILoadingCommand command) { m_Commands?.Remove(command); }
void ILoadingManager.Start() { m_Complete = false; m_Progress = new MultiProgress(m_Commands.Select((iter) => iter.Command).ToArray()); System.Threading.EventWaitHandle @event = new System.Threading.AutoResetEvent(true); var context = System.Threading.SynchronizationContext.Current; Task.Run( () => { //копия для возможности перезагрузки игры List <CommandItem> commands = new List <CommandItem>(m_Commands); Prepare(); //пока есть комманды while (commands.Count > 0) { //получаем комманды, для которых нет зависимостей ILoadingCommand cmd = null; while ((cmd = GetNextCommand()) != null) { //запускаем выполнение комманды context.Post( (postCommand) => { ((ILoadingCommand)postCommand).Exec(this, (cmd) => { //удаляем из зависимостей RemoveDependency(cmd); @event.Set(); }); }, cmd); } //ожидание выполнения комманд while ([email protected](15)) { foreach (var iter in m_Commands) { context.Post( (postCommand) => { cmd = postCommand as ILoadingCommand; m_Progress.SetProgress(cmd, cmd.GetProgress()); }, iter.Command); } } } //финализация прогресса context.Post( (state) => { m_Progress.SetDone(); m_Complete = true; m_OnLoadComplete?.Invoke(); }, null); ILoadingCommand GetNextCommand() { var item = commands .FirstOrDefault((iter) => !iter.Dependency.HasDependency); if (item != null) { commands.Remove(item); } return(item?.Command ?? null); } void RemoveDependency(ILoadingCommand command) { foreach (var iter in commands) { iter.Dependency.Remove(command); } } void Prepare() { foreach (var iter in commands) { iter.Dependency.Rebuild(this); } } }); }
public void Add(ILoadingCommand command) { m_Commands?.Add(command); }