Mercurial > pub > ImplabNet
comparison Implab/AbstractEvent.cs @ 186:75103928da09 ref20160224
working on cancelation and error handling
author | cin |
---|---|
date | Tue, 19 Apr 2016 00:50:14 +0300 |
parents | 822aab37b107 |
children | d6fe09f5592c |
comparison
equal
deleted
inserted
replaced
185:822aab37b107 | 186:75103928da09 |
---|---|
75 /// будут проигнорированы. | 75 /// будут проигнорированы. |
76 /// </remarks> | 76 /// </remarks> |
77 /// <param name="error">Исключение возникшее при выполнении операции</param> | 77 /// <param name="error">Исключение возникшее при выполнении операции</param> |
78 /// <exception cref="InvalidOperationException">Данное обещание уже выполнено</exception> | 78 /// <exception cref="InvalidOperationException">Данное обещание уже выполнено</exception> |
79 protected void SetError(Exception error) { | 79 protected void SetError(Exception error) { |
80 while (error is PromiseTransientException) | |
81 error = error.InnerException; | |
82 | |
83 var isCancel = error is OperationCanceledException; | |
84 | |
85 if (BeginTransit()) { | 80 if (BeginTransit()) { |
86 m_error = isCancel ? error.InnerException : error; | 81 m_error = error; |
87 CompleteTransit(isCancel ? CANCELLED_STATE : REJECTED_STATE); | 82 CompleteTransit(REJECTED_STATE); |
88 | 83 |
89 Signal(); | 84 Signal(); |
90 } else { | 85 } else { |
91 WaitTransition(); | 86 WaitTransition(); |
92 if (!isCancel || m_state == SUCCEEDED_STATE) | 87 if (m_state == SUCCEEDED_STATE) |
93 throw new InvalidOperationException("The promise is already resolved"); | 88 throw new InvalidOperationException("The promise is already resolved"); |
94 } | 89 } |
95 } | 90 } |
96 | 91 |
97 /// <summary> | 92 /// <summary> |
138 | 133 |
139 switch (m_state) { | 134 switch (m_state) { |
140 case SUCCEEDED_STATE: | 135 case SUCCEEDED_STATE: |
141 return; | 136 return; |
142 case CANCELLED_STATE: | 137 case CANCELLED_STATE: |
143 throw new OperationCanceledException(); | 138 throw new OperationCanceledException("The operation has been cancelled", m_error); |
144 case REJECTED_STATE: | 139 case REJECTED_STATE: |
145 throw new TargetInvocationException(m_error); | 140 throw new TargetInvocationException(m_error); |
146 default: | 141 default: |
147 throw new ApplicationException(String.Format("Invalid promise state {0}", m_state)); | 142 throw new ApplicationException(String.Format("The promise state {0} is invalid", m_state)); |
148 } | 143 } |
149 } | 144 } |
150 #endregion | 145 #endregion |
151 | 146 |
152 #region handlers managment | 147 #region handlers managment |