Mercurial > pub > ImplabNet
comparison Implab/ActionChainTaskBase.cs @ 192:f1da3afc3521 release v2.1
Слияние с v2
author | cin |
---|---|
date | Fri, 22 Apr 2016 13:10:34 +0300 |
parents | dd4a3590f9c6 |
children | 40d7fed4a09e |
comparison
equal
deleted
inserted
replaced
71:1714fd8678ef | 192:f1da3afc3521 |
---|---|
1 using System; | |
2 using System.Threading; | |
3 | |
4 namespace Implab { | |
5 public class ActionChainTaskBase : AbstractTask { | |
6 readonly Func<Exception, IPromise> m_error; | |
7 readonly Func<Exception, IPromise> m_cancel; | |
8 | |
9 protected ActionChainTaskBase(Func<Exception, IPromise> error, Func<Exception, IPromise> cancel, bool autoCancellable) { | |
10 m_error = error; | |
11 m_cancel = cancel; | |
12 if (autoCancellable) | |
13 CancellationRequested(CancelOperation); | |
14 } | |
15 | |
16 public void Reject(Exception error) { | |
17 if (LockCancelation()) | |
18 HandleErrorInternal(error); | |
19 } | |
20 | |
21 public override void CancelOperation(Exception reason) { | |
22 if (LockCancelation()) | |
23 // отмена вызвана до начала выполнения задачи | |
24 HandleCancelInternal(reason); | |
25 } | |
26 | |
27 protected void HandleCancelInternal(Exception reason) { | |
28 if (m_cancel != null) { | |
29 try { | |
30 // вызываем обработчик отмены | |
31 var p = m_cancel(reason); | |
32 p.On(SetResult, HandleErrorInternal, SetCancelledInternal); | |
33 // сообщаем асинхронной операции, что клиент уже не хочет получать результат | |
34 // т.е. если он инициировал отмену, задача отменилась, вызвался обрабочик отмены | |
35 // отбработчику сообщили, что результат уже не нужен и уже сам обработчик решает | |
36 // отдавать ли результат или подтвердить отмену (или вернуть ошибку). | |
37 CancellationRequested(p.Cancel); | |
38 } catch (Exception err) { | |
39 HandleErrorInternal(err); | |
40 } | |
41 } else { | |
42 HandleErrorInternal(reason ?? new OperationCanceledException()); | |
43 } | |
44 } | |
45 | |
46 protected void HandleErrorInternal(Exception error) { | |
47 if (m_error != null) { | |
48 try { | |
49 var p = m_error(error); | |
50 p.On(SetResult, SetErrorInternal, SetCancelledInternal); | |
51 CancellationRequested(p.Cancel); | |
52 } catch (Exception err) { | |
53 SetErrorInternal(error); | |
54 } | |
55 } else { | |
56 SetErrorInternal(error); | |
57 } | |
58 } | |
59 | |
60 } | |
61 } | |
62 |