view Implab/AbstractTaskT.cs @ 223:27ea7f07e2e4 default

Слияние
author cin
date Tue, 22 Aug 2017 09:35:54 +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)
            );
        }
    }
}