/// <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); } }
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(); }
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(); }