comparison Implab/Components/RunnableComponent.cs @ 187:dd4a3590f9c6 ref20160224

Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler Any unhandled OperationCanceledException will cause the promise cancelation
author cin
date Tue, 19 Apr 2016 17:35:20 +0300
parents 75103928da09
children 40d7fed4a09e
comparison
equal deleted inserted replaced
186:75103928da09 187:dd4a3590f9c6
135 m_pending = null; 135 m_pending = null;
136 m_lastError = e; 136 m_lastError = e;
137 } 137 }
138 } 138 }
139 throw new PromiseTransientException(e); 139 throw new PromiseTransientException(e);
140 },
141 r => {
142 // handle cancellation as exception
143 throw new OperationCanceledException("The operation has been cancelled", r);
144 } 140 }
145 ); 141 );
146 142
147 m_pending = promise; 143 m_pending = promise;
148 } 144 }
192 /// <param name="stop">Stop.</param> 188 /// <param name="stop">Stop.</param>
193 protected virtual void StopPending(IPromise current, IDeferred stop) { 189 protected virtual void StopPending(IPromise current, IDeferred stop) {
194 if (current == null) { 190 if (current == null) {
195 stop.Resolve(); 191 stop.Resolve();
196 } else { 192 } else {
197 current.On(stop.Resolve, stop.Reject, e => stop.Resolve()); 193 // связваем текущую операцию с операцией остановки
194 current.On(
195 stop.Resolve, // если текущая операция заверщилась, то можно начинать остановку
196 stop.Reject, // если текущая операция дала ошибку - то все плохо, нельзя продолжать
197 e => stop.Resolve() // если текущая отменилась, то можно начинать остановку
198 );
199 // посылаем текущей операции сигнал остановки
198 current.Cancel(); 200 current.Cancel();
199 } 201 }
200 } 202 }
201 203
202 public ExecutionState State { 204 public ExecutionState State {