Mercurial > pub > ImplabNet
annotate Implab/ActionTaskBase.cs @ 243:b1e0ffdf3451 v3
working on promises
author | cin |
---|---|
date | Wed, 24 Jan 2018 19:24:10 +0300 |
parents | 40d7fed4a09e |
children |
rev | line source |
---|---|
145 | 1 using System; |
2 | |
3 namespace Implab { | |
187
dd4a3590f9c6
Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler
cin
parents:
149
diff
changeset
|
4 public class ActionTaskBase : AbstractTask { |
145 | 5 readonly Action<Exception> m_cancel; |
6 readonly Action<Exception> m_error; | |
7 | |
149 | 8 protected ActionTaskBase( Action<Exception> error, Action<Exception> cancel, bool autoCancellable) { |
145 | 9 m_error = error; |
10 m_cancel = cancel; | |
149 | 11 if (autoCancellable) |
12 CancellationRequested(CancelOperation); | |
145 | 13 } |
14 | |
15 public void Reject(Exception error) { | |
16 Safe.ArgumentNotNull(error, "error"); | |
17 if (LockCancelation()) | |
18 HandleErrorInternal(error); | |
19 } | |
20 | |
187
dd4a3590f9c6
Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler
cin
parents:
149
diff
changeset
|
21 public override void CancelOperation(Exception reason) { |
dd4a3590f9c6
Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler
cin
parents:
149
diff
changeset
|
22 if (LockCancelation()) |
dd4a3590f9c6
Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler
cin
parents:
149
diff
changeset
|
23 HandleCancelInternal(reason); |
dd4a3590f9c6
Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler
cin
parents:
149
diff
changeset
|
24 } |
dd4a3590f9c6
Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler
cin
parents:
149
diff
changeset
|
25 |
145 | 26 protected void HandleErrorInternal(Exception error) { |
27 if (m_error != null) { | |
28 try { | |
29 m_error(error); | |
30 SetResult(); | |
31 } catch(Exception err) { | |
187
dd4a3590f9c6
Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler
cin
parents:
149
diff
changeset
|
32 SetErrorInternal(err); |
145 | 33 } |
34 } else { | |
187
dd4a3590f9c6
Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler
cin
parents:
149
diff
changeset
|
35 SetErrorInternal(error); |
145 | 36 } |
37 } | |
38 | |
187
dd4a3590f9c6
Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler
cin
parents:
149
diff
changeset
|
39 protected void HandleCancelInternal(Exception error) { |
dd4a3590f9c6
Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler
cin
parents:
149
diff
changeset
|
40 if (m_cancel != null) { |
dd4a3590f9c6
Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler
cin
parents:
149
diff
changeset
|
41 try { |
dd4a3590f9c6
Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler
cin
parents:
149
diff
changeset
|
42 m_cancel(error); |
dd4a3590f9c6
Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler
cin
parents:
149
diff
changeset
|
43 SetResult(); |
dd4a3590f9c6
Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler
cin
parents:
149
diff
changeset
|
44 } catch(Exception err) { |
196
40d7fed4a09e
fixed promise chaining behavior, the error handler doesn't handle result or cancellation handlers exceptions these exceptions are propagated to the next handlers.
cin
parents:
187
diff
changeset
|
45 SetErrorInternal(err); |
145 | 46 } |
187
dd4a3590f9c6
Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler
cin
parents:
149
diff
changeset
|
47 } else { |
196
40d7fed4a09e
fixed promise chaining behavior, the error handler doesn't handle result or cancellation handlers exceptions these exceptions are propagated to the next handlers.
cin
parents:
187
diff
changeset
|
48 SetCancelledInternal(error); |
145 | 49 } |
50 } | |
51 } | |
52 } | |
53 |