Esempio n. 1
0
 public void AddAsyncAction(AsyncActionUpdate update)
 {
     if (update == null)
     {
         throw new ArgumentNullException(nameof(update));
     }
     asyncActions.Add(update);
 }
Esempio n. 2
0
        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);
                }
            }
        }