Exemple #1
0
 // 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}'.");
     }
 }
Exemple #2
0
 /// <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);
 }
Exemple #3
0
        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);
                }
            }
        }