コード例 #1
0
        /// <summary>
        /// Добавить задачу в очередь
        /// </summary>
        /// <param name="key">ключь</param>
        /// <param name="actionParams">значение</param>
        /// <param name="token">токен отмены операции</param>
        /// <remarks>при добавлении новой задачи очередь автоматически начинает выполняться,
        /// при этом первыми будут выполнены ранее сохраненные задачи</remarks>
        public void Enqueue(TKey key, TActionParams actionParams, CancellationToken?token = null)
        {
            Start(token);//продолжить выполнять задачи, если они есть в очереди

            //добавить в очередь задачу
            lock (Lock)
            {
                Repository.Set(key, actionParams);
                if (_autoSave)
                {
                    Save();
                }


                if (ProcessingTasks.Contains(key))
                {
                    throw new Exception(string.Format("Задача с ключом {0} уже выполнялась", key));
                }

                if (PoolTasks.Contains(key))
                {
                    throw new Exception(string.Format("Задача с ключом {0} уже содержется в пуле", key));
                }

                if (FailTasks.Contains(key))
                {
                    throw new Exception(string.Format("Задача с ключом {0} уже завершилась ошибкой", key));
                }

                PoolTasks.Add(key);
                Pool.Invoke(Perform, key, actionParams, token);
            }
        }
コード例 #2
0
        private async ValueTask DisposeImpl(bool isAsync)
        {
            if (ActiveTasks != null)
            {
                ActiveTasks.Clear();
                ActiveTasks = null;
            }

            if (ProcessingTasks != null)
            {
                ProcessingTasks.Clear();
                ProcessingTasks = null;
            }

            if (ActiveCommand != null)
            {
                if (isAsync)
                {
                    await ActiveCommand.DisposeAsync().ConfigureAwait(false);
                }
                else
                {
                    ActiveCommand.Dispose();
                }

                ActiveCommand = null;
            }

            NotifyDisposed();
        }
コード例 #3
0
 public void Dispose()
 {
     if (ActiveTasks != null)
     {
         ActiveTasks.Clear();
         ActiveTasks = null;
     }
     if (ProcessingTasks != null)
     {
         ProcessingTasks.Clear();
         ProcessingTasks = null;
     }
     if (ActiveCommand != null)
     {
         ActiveCommand.Dispose();
         ActiveCommand = null;
     }
     NotifyDisposed();
 }