// TODO: Put strings into the resources. // protected override void QueueTask(Task task) { task.EnsureNotNull(nameof(task)); // if (_tasksQueue.UpdateValue(o => o.Contains(task) ? o : o.Add(task))) { for (; ;) { var processQueueRunningCount = VolatileUtilities.Read(ref _processQueueRunningCount); if (processQueueRunningCount < _maxDop) { if (processQueueRunningCount == Interlocked.CompareExchange(ref _processQueueRunningCount, processQueueRunningCount + 1, processQueueRunningCount)) { P_ProcessQueue(); break; } } else { break; } } } else { throw new InvalidOperationException($"Указанная задача уже ранее была поставлена в очередь шедулера '{this}'."); } }
/// <summary> /// Метод, вызываемый перед явной или неявной выгрузкой. /// <para>Не предназначен для прямого вызова из кода.</para> /// <para>Метод не вызывается после того, как один из вызывов был выполнен успешно.</para> /// <para>На момент вызова метода <seealso cref="Disposable.IsDisposeRequested"/> == true.</para> /// <para>Перед вызовом базовой реализации <seealso cref="Disposable.FireBeforeDispose(bool)"/> вызывает обработчик события <seealso cref="BeforeDispose"/>.</para> /// </summary> /// <param name="explicitDispose">Указывает на явную/не явную выгрузку.</param> protected override void FireBeforeDispose(bool explicitDispose) { if (explicitDispose) { VolatileUtilities.Read(ref _eventHandler_BeforeDispose)?.Invoke(this, new DisposeEventArgs(explicitDispose)); } // base.FireBeforeDispose(explicitDispose); }
protected override void FireAfterDisposed(bool explicitDispose) { base.FireAfterDisposed(explicitDispose); // var notExceptionThrown = true; try { if (explicitDispose) { VolatileUtilities.Read(ref _eventHandler_AfterDisposed)?.Invoke(this, new DisposeEventArgs(explicitDispose)); } } catch { notExceptionThrown = false; throw; } finally { if (notExceptionThrown) { VolatileUtilities.Write(ref _eventHandler_AfterDisposed, null); } } }