public void AddAsyncAction(AsyncActionUpdate update) { if (update == null) { throw new ArgumentNullException(nameof(update)); } asyncActions.Add(update); }
private void ScheduleWaitingTask(object state) { AsyncActionUpdate update = state as AsyncActionUpdate; ActionWithPriorityWrapper placeholder = null; if (update.UpdateTask.Status == TaskStatus.Running || update.UpdateTask.Status == TaskStatus.WaitingToRun || update.UpdateTask.Status == TaskStatus.WaitingForActivation) { placeholder = new ActionWithPriorityWrapper(update.Placeholder, update.Priority); lock (mutex_locker) { actions.Add(placeholder); int index = actions.IndexOf(placeholder); syncContext.Send(s => target_list.Insert(index, placeholder.Action), null); } try { update.UpdateTask.Wait(); } catch (AggregateException ex) { if (ex.InnerException is TaskCanceledException) { } else { throw ex; } } } if (update.UpdateTask.Status == TaskStatus.RanToCompletion) { if (placeholder != null) { lock (mutex_locker) { syncContext.Send(s => target_list.Remove(placeholder.Action), null); actions.Remove(placeholder); } } ActionUpdateResult result = update.UpdateTask.Result; ActionWithPriorityWrapper wrapper = new ActionWithPriorityWrapper(result.Action, result.Priority); lock (mutex_locker) { actions.Add(wrapper); int index = actions.IndexOf(wrapper); syncContext.Send(s => target_list.Insert(index, wrapper.Action), null); } return; } else if (placeholder != null && (update.UpdateTask.Status == TaskStatus.Canceled || update.UpdateTask.Status == TaskStatus.Faulted)) { lock (mutex_locker) { syncContext.Send(s => target_list.Remove(placeholder.Action), null); actions.Remove(placeholder); } } }