@@ -132,7 +132,7 namespace Implab.Test { | |||||
132 | ShouldThrow(() => p.Join(1000)); |
|
132 | ShouldThrow(() => p.Join(1000)); | |
133 | Assert.AreEqual(ExecutionState.Failed, comp.State); |
|
133 | Assert.AreEqual(ExecutionState.Failed, comp.State); | |
134 |
|
134 | |||
135 |
Assert.Is |
|
135 | Assert.IsTrue(comp.LastError is OperationCanceledException); | |
136 |
|
136 | |||
137 | comp.Dispose(); |
|
137 | comp.Dispose(); | |
138 | } |
|
138 | } | |
@@ -185,7 +185,7 namespace Implab.Test { | |||||
185 | p.Cancel(); |
|
185 | p.Cancel(); | |
186 | ShouldThrow(() => p.Join(1000)); |
|
186 | ShouldThrow(() => p.Join(1000)); | |
187 | Assert.AreEqual(ExecutionState.Failed, comp.State); |
|
187 | Assert.AreEqual(ExecutionState.Failed, comp.State); | |
188 |
Assert.Is |
|
188 | Assert.IsTrue(comp.LastError is OperationCanceledException); | |
189 |
|
189 | |||
190 | comp.Dispose(); |
|
190 | comp.Dispose(); | |
191 | } |
|
191 | } |
@@ -23,10 +23,8 namespace Implab { | |||||
23 | var p = m_task(); |
|
23 | var p = m_task(); | |
24 | p.On(SetResult, HandleErrorInternal, HandleCancelInternal); |
|
24 | p.On(SetResult, HandleErrorInternal, HandleCancelInternal); | |
25 | CancellationRequested(p.Cancel); |
|
25 | CancellationRequested(p.Cancel); | |
26 | } catch (OperationCanceledException reason){ |
|
|||
27 | HandleCancelInternal(reason); |
|
|||
28 | } catch(Exception err) { |
|
26 | } catch(Exception err) { | |
29 |
|
|
27 | SetErrorInternal(err); | |
30 | } |
|
28 | } | |
31 | } |
|
29 | } | |
32 | } |
|
30 | } |
@@ -36,10 +36,10 namespace Implab { | |||||
36 | // отдавать ли результат или подтвердить отмену (или вернуть ошибку). |
|
36 | // отдавать ли результат или подтвердить отмену (или вернуть ошибку). | |
37 | CancellationRequested(p.Cancel); |
|
37 | CancellationRequested(p.Cancel); | |
38 | } catch (Exception err) { |
|
38 | } catch (Exception err) { | |
39 |
|
|
39 | SetErrorInternal(err); | |
40 | } |
|
40 | } | |
41 | } else { |
|
41 | } else { | |
42 | HandleErrorInternal(reason ?? new OperationCanceledException()); |
|
42 | SetCancelledInternal(reason); | |
43 | } |
|
43 | } | |
44 | } |
|
44 | } | |
45 |
|
45 |
@@ -14,10 +14,8 namespace Implab { | |||||
14 | var p = m_task(value); |
|
14 | var p = m_task(value); | |
15 | p.On(SetResult, HandleErrorInternal, HandleCancelInternal); |
|
15 | p.On(SetResult, HandleErrorInternal, HandleCancelInternal); | |
16 | CancellationRequested(p.Cancel); |
|
16 | CancellationRequested(p.Cancel); | |
17 | } catch (OperationCanceledException reason) { |
|
|||
18 | HandleCancelInternal(reason); |
|
|||
19 | } catch(Exception err) { |
|
17 | } catch(Exception err) { | |
20 |
|
|
18 | SetErrorInternal(err); | |
21 | } |
|
19 | } | |
22 | } |
|
20 | } | |
23 | } |
|
21 | } |
@@ -12,10 +12,8 namespace Implab { | |||||
12 | try { |
|
12 | try { | |
13 | m_task(); |
|
13 | m_task(); | |
14 | SetResult(); |
|
14 | SetResult(); | |
15 | } catch(OperationCanceledException reason) { |
|
|||
16 | HandleCancelInternal(reason); |
|
|||
17 | } catch(Exception err) { |
|
15 | } catch(Exception err) { | |
18 |
|
|
16 | SetErrorInternal(err); | |
19 | } |
|
17 | } | |
20 | } |
|
18 | } | |
21 | } |
|
19 | } |
@@ -42,10 +42,10 namespace Implab { | |||||
42 | m_cancel(error); |
|
42 | m_cancel(error); | |
43 | SetResult(); |
|
43 | SetResult(); | |
44 | } catch(Exception err) { |
|
44 | } catch(Exception err) { | |
45 |
|
|
45 | SetErrorInternal(err); | |
46 | } |
|
46 | } | |
47 | } else { |
|
47 | } else { | |
48 | HandleErrorInternal(error ?? new OperationCanceledException()); |
|
48 | SetCancelledInternal(error); | |
49 | } |
|
49 | } | |
50 | } |
|
50 | } | |
51 | } |
|
51 | } |
@@ -12,10 +12,8 namespace Implab { | |||||
12 | try { |
|
12 | try { | |
13 | m_task(value); |
|
13 | m_task(value); | |
14 | SetResult(); |
|
14 | SetResult(); | |
15 | } catch(OperationCanceledException reason) { |
|
|||
16 | HandleCancelInternal(reason); |
|
|||
17 | } catch(Exception err) { |
|
15 | } catch(Exception err) { | |
18 |
|
|
16 | SetErrorInternal(err); | |
19 | } |
|
17 | } | |
20 | } |
|
18 | } | |
21 | } |
|
19 | } |
@@ -120,6 +120,20 namespace Implab.Components { | |||||
120 |
|
120 | |||
121 | prev = m_pending; |
|
121 | prev = m_pending; | |
122 |
|
122 | |||
|
123 | Action<Exception> errorOrCancel = e => { | |||
|
124 | if (e == null) | |||
|
125 | e = new OperationCanceledException(); | |||
|
126 | ||||
|
127 | lock (m_stateMachine) { | |||
|
128 | if (m_pending == promise) { | |||
|
129 | Move(Commands.Fail); | |||
|
130 | m_pending = null; | |||
|
131 | m_lastError = e; | |||
|
132 | } | |||
|
133 | } | |||
|
134 | throw new PromiseTransientException(e); | |||
|
135 | }; | |||
|
136 | ||||
123 | promise = task.Then( |
|
137 | promise = task.Then( | |
124 | () => { |
|
138 | () => { | |
125 | lock(m_stateMachine) { |
|
139 | lock(m_stateMachine) { | |
@@ -128,16 +142,9 namespace Implab.Components { | |||||
128 | m_pending = null; |
|
142 | m_pending = null; | |
129 | } |
|
143 | } | |
130 | } |
|
144 | } | |
131 |
}, |
|
145 | }, | |
132 | lock(m_stateMachine) { |
|
146 | errorOrCancel, | |
133 | if (m_pending == promise) { |
|
147 | errorOrCancel | |
134 | Move(Commands.Fail); |
|
|||
135 | m_pending = null; |
|
|||
136 | m_lastError = e; |
|
|||
137 | } |
|
|||
138 | } |
|
|||
139 | throw new PromiseTransientException(e); |
|
|||
140 | } |
|
|||
141 | ); |
|
148 | ); | |
142 |
|
149 | |||
143 | m_pending = promise; |
|
150 | m_pending = promise; |
@@ -15,10 +15,8 namespace Implab { | |||||
15 | var operation = m_task(); |
|
15 | var operation = m_task(); | |
16 | operation.On(SetResult, HandleErrorInternal, HandleCancelInternal); |
|
16 | operation.On(SetResult, HandleErrorInternal, HandleCancelInternal); | |
17 | CancellationRequested(operation.Cancel); |
|
17 | CancellationRequested(operation.Cancel); | |
18 | } catch (OperationCanceledException reason) { |
|
|||
19 | HandleCancelInternal(reason); |
|
|||
20 | } catch (Exception err) { |
|
18 | } catch (Exception err) { | |
21 |
|
|
19 | SetErrorInternal(err); | |
22 | } |
|
20 | } | |
23 | } |
|
21 | } | |
24 | } |
|
22 | } |
@@ -43,10 +43,10 namespace Implab { | |||||
43 | p.On(SetResult, HandleErrorInternal, SetCancelledInternal); |
|
43 | p.On(SetResult, HandleErrorInternal, SetCancelledInternal); | |
44 | CancellationRequested(p.Cancel); |
|
44 | CancellationRequested(p.Cancel); | |
45 | } catch (Exception err) { |
|
45 | } catch (Exception err) { | |
46 |
|
|
46 | SetErrorInternal(err); | |
47 | } |
|
47 | } | |
48 | } else { |
|
48 | } else { | |
49 | HandleErrorInternal(reason ?? new OperationCanceledException()); |
|
49 | SetCancelledInternal(reason); | |
50 | } |
|
50 | } | |
51 | } |
|
51 | } | |
52 | } |
|
52 | } |
@@ -14,10 +14,8 namespace Implab { | |||||
14 | var operation = m_task(value); |
|
14 | var operation = m_task(value); | |
15 | operation.On(SetResult, HandleErrorInternal, SetCancelled); |
|
15 | operation.On(SetResult, HandleErrorInternal, SetCancelled); | |
16 | CancellationRequested(operation.Cancel); |
|
16 | CancellationRequested(operation.Cancel); | |
17 | } catch (OperationCanceledException reason) { |
|
|||
18 | HandleCancelInternal(reason); |
|
|||
19 | } catch (Exception err) { |
|
17 | } catch (Exception err) { | |
20 |
|
|
18 | SetErrorInternal(err); | |
21 | } |
|
19 | } | |
22 | } |
|
20 | } | |
23 | } |
|
21 | } |
@@ -13,10 +13,8 namespace Implab { | |||||
13 | if (m_task != null && LockCancelation()) { |
|
13 | if (m_task != null && LockCancelation()) { | |
14 | try { |
|
14 | try { | |
15 | SetResult(m_task()); |
|
15 | SetResult(m_task()); | |
16 | } catch(OperationCanceledException reason) { |
|
|||
17 | HandleCancelInternal(reason); |
|
|||
18 | } catch(Exception err) { |
|
16 | } catch(Exception err) { | |
19 |
|
|
17 | SetErrorInternal(err); | |
20 | } |
|
18 | } | |
21 | } |
|
19 | } | |
22 | } |
|
20 | } |
@@ -40,10 +40,10 namespace Implab { | |||||
40 | try { |
|
40 | try { | |
41 | SetResult(m_cancel(reason)); |
|
41 | SetResult(m_cancel(reason)); | |
42 | } catch (Exception err) { |
|
42 | } catch (Exception err) { | |
43 |
|
|
43 | SetErrorInternal(err); | |
44 | } |
|
44 | } | |
45 | } else { |
|
45 | } else { | |
46 | HandleErrorInternal(reason ?? new OperationCanceledException()); |
|
46 | SetCancelledInternal(reason); | |
47 | } |
|
47 | } | |
48 | } |
|
48 | } | |
49 |
|
49 |
@@ -12,10 +12,8 namespace Implab { | |||||
12 | if (m_task != null && LockCancelation()) { |
|
12 | if (m_task != null && LockCancelation()) { | |
13 | try { |
|
13 | try { | |
14 | SetResult(m_task(value)); |
|
14 | SetResult(m_task(value)); | |
15 | } catch(OperationCanceledException reason) { |
|
|||
16 | HandleCancelInternal(reason); |
|
|||
17 | } catch(Exception err) { |
|
15 | } catch(Exception err) { | |
18 |
|
|
16 | SetErrorInternal(err); | |
19 | } |
|
17 | } | |
20 | } |
|
18 | } | |
21 | } |
|
19 | } |
General Comments 0
You need to be logged in to leave comments.
Login now