Mercurial > pub > ImplabNet
view Implab/AbstractTaskT.cs @ 207:558f34b2fb50 v2
added Safe.DispatchEvent() a legacy equivalent for '?.Invoke()'
added Safe.Dispose(IEnumerable)
added PromiseExtensions.CancellationPoint to add a cancellation point to the chain of promises
added IPromise<T> PromiseExtensions.Then<T>(this IPromise<T> that, Action<T> success) overloads
added PromiseExtensions.Error() overloads to handle a error or(and) a cancellation
author | cin |
---|---|
date | Wed, 09 Nov 2016 12:03:22 +0300 |
parents | dd4a3590f9c6 |
children |
line wrap: on
line source
using System; using System.Threading; namespace Implab { public abstract class AbstractTask<T> : AbstractPromise<T> { int m_cancelationLock; /// <summary> /// Получает эксклюзивное право отмены задания, используется для отмены задания до начала его выполнения. /// </summary> /// <returns><c>true</c>, if cancelation was locked, <c>false</c> otherwise.</returns> protected bool LockCancelation() { return 0 == Interlocked.CompareExchange(ref m_cancelationLock, 1, 0); } protected void SetErrorInternal(Exception error) { // unwrap while (error is PromiseTransientException && error.InnerException != null) error = error.InnerException; if (error is OperationCanceledException) SetCancelled(error); else SetError(error); } protected void SetCancelledInternal(Exception reason) { SetCancelled( reason == null ? new OperationCanceledException() : reason is OperationCanceledException ? reason : new OperationCanceledException(null, reason) ); } } }