comparison Implab/FuncChainTaskT.cs @ 149:eb793fbbe4ea v2

fixed promises cancellation
author cin
date Wed, 06 May 2015 17:11:27 +0300
parents 706fccb85524
children dd4a3590f9c6
comparison
equal deleted inserted replaced
148:e6d4b41f0101 149:eb793fbbe4ea
2 2
3 namespace Implab { 3 namespace Implab {
4 public class FuncChainTask<TArg,TResult> : FuncChainTaskBase<TResult>, IDeferred<TArg> { 4 public class FuncChainTask<TArg,TResult> : FuncChainTaskBase<TResult>, IDeferred<TArg> {
5 readonly Func<TArg, IPromise<TResult>> m_task; 5 readonly Func<TArg, IPromise<TResult>> m_task;
6 6
7 public FuncChainTask(Func<TArg, IPromise<TResult>> task, Func<Exception, IPromise<TResult>> error, Func<Exception, IPromise<TResult>> cancel) : base(error, cancel){ 7 public FuncChainTask(Func<TArg, IPromise<TResult>> task, Func<Exception, IPromise<TResult>> error, Func<Exception, IPromise<TResult>> cancel, bool autoCancellable) : base(error, cancel, autoCancellable){
8 m_task = task; 8 m_task = task;
9 } 9 }
10 10
11 public void Resolve(TArg value) { 11 public void Resolve(TArg value) {
12 if (m_task != null && LockCancelation()) { 12 if (m_task != null && LockCancelation()) {
13 try { 13 try {
14 Observe(m_task(value)); 14 var operation = m_task(value);
15 operation.On(SetResult, HandleErrorInternal, SetCancelled);
16 CancellationRequested(operation.Cancel);
15 } catch (Exception err) { 17 } catch (Exception err) {
16 HandleErrorInternal(err); 18 HandleErrorInternal(err);
17 } 19 }
18 } 20 }
19 } 21 }