##// END OF EJS Templates
Слияние
Слияние

File last commit:

r187:dd4a3590f9c6 ref20160224
r223:27ea7f07e2e4 merge default
Show More
AbstractTaskT.cs
36 lines | 1.3 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 {
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)
);
}
}
}