##// END OF EJS Templates
working on promises
working on promises

File last commit:

r187:dd4a3590f9c6 ref20160224
r245:b904e0a3ba72 v3
Show More
AbstractTask.cs
45 lines | 2.0 KiB | text/x-csharp | CSharpLexer
cin
Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler...
r187 using System;
using System.Threading;
namespace Implab {
/// <summary>
/// Базовый класс для реализации задачь. Задача представляет собой некторое
/// действие, которое можно иницировать и обработать результат его выполнения
/// в виде обещания, для этого оно реализует интерфейс <see cref="IPromise"/>.
/// </summary>
/// <remarks>
/// Данный класс определяет стандартное поведение при обработки результатов, в частности
/// обработку <see cref="System.OperationCanceledException"/> и <see cref="PromiseTransientException"/>
/// </remarks>
public abstract class AbstractTask : AbstractPromise {
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)
);
}
}
}