Mercurial > pub > ImplabNet
comparison Implab/Components/RunnableComponent.cs @ 203:4d9830a9bbb8 v2
Added 'Fail' method to RunnableComponent which allows component to move from
Running to Failed state.
Added PollingComponent a timer based runnable component
More tests
Added FailPromise a thin class to wrap exceptions
Fixed error handling in SuccessPromise classes.
| author | cin |
|---|---|
| date | Tue, 18 Oct 2016 17:49:54 +0300 |
| parents | 2651cb9a4250 |
| children | 8200ab154c8a |
comparison
equal
deleted
inserted
replaced
| 202:2651cb9a4250 | 203:4d9830a9bbb8 |
|---|---|
| 69 | 69 |
| 70 readonly StateMachine m_stateMachine; | 70 readonly StateMachine m_stateMachine; |
| 71 | 71 |
| 72 protected RunnableComponent(bool initialized) { | 72 protected RunnableComponent(bool initialized) { |
| 73 m_stateMachine = new StateMachine(initialized ? ExecutionState.Ready : ExecutionState.Created); | 73 m_stateMachine = new StateMachine(initialized ? ExecutionState.Ready : ExecutionState.Created); |
| 74 } | 74 DisposeTimeout = 10000; |
| 75 | 75 } |
| 76 protected virtual int DisposeTimeout { | 76 |
| 77 get { | 77 /// <summary> |
| 78 return 10000; | 78 /// Gets or sets the timeout to wait for the pending operation to complete. If the pending operation doesn't finish than the component will be disposed anyway. |
| 79 } | 79 /// </summary> |
| 80 protected int DisposeTimeout { | |
| 81 get; | |
| 82 set; | |
| 80 } | 83 } |
| 81 | 84 |
| 82 void ThrowInvalidCommand(Commands cmd) { | 85 void ThrowInvalidCommand(Commands cmd) { |
| 83 if (m_stateMachine.State == ExecutionState.Disposed) | 86 if (m_stateMachine.State == ExecutionState.Disposed) |
| 84 throw new ObjectDisposedException(ToString()); | 87 throw new ObjectDisposedException(ToString()); |
| 87 } | 90 } |
| 88 | 91 |
| 89 void Move(Commands cmd) { | 92 void Move(Commands cmd) { |
| 90 if (!m_stateMachine.Move(cmd)) | 93 if (!m_stateMachine.Move(cmd)) |
| 91 ThrowInvalidCommand(cmd); | 94 ThrowInvalidCommand(cmd); |
| 95 } | |
| 96 | |
| 97 /// <summary> | |
| 98 /// Moves the component from running to failed state. | |
| 99 /// </summary> | |
| 100 /// <param name="error">The exception which is describing the error.</param> | |
| 101 /// <returns>Returns true if the component is set to the failed state, false - otherwise. | |
| 102 /// This method works only for the running state, in any other state it will return false.</returns> | |
| 103 protected bool Fail(Exception error) { | |
| 104 lock (m_stateMachine) { | |
| 105 if(m_stateMachine.State == ExecutionState.Running) { | |
| 106 m_stateMachine.Move(Commands.Fail); | |
| 107 m_lastError = error; | |
| 108 return true; | |
| 109 } | |
| 110 } | |
| 111 return false; | |
| 92 } | 112 } |
| 93 | 113 |
| 94 void Invoke(Commands cmd, Action action) { | 114 void Invoke(Commands cmd, Action action) { |
| 95 lock (m_stateMachine) | 115 lock (m_stateMachine) |
| 96 Move(cmd); | 116 Move(cmd); |
| 208 } | 228 } |
| 209 } | 229 } |
| 210 | 230 |
| 211 public ExecutionState State { | 231 public ExecutionState State { |
| 212 get { | 232 get { |
| 213 lock (m_stateMachine) | 233 return m_stateMachine.State; |
| 214 return m_stateMachine.State; | |
| 215 } | 234 } |
| 216 } | 235 } |
| 217 | 236 |
| 218 public Exception LastError { | 237 public Exception LastError { |
| 219 get { | 238 get { |
| 223 | 242 |
| 224 #endregion | 243 #endregion |
| 225 | 244 |
| 226 #region IDisposable implementation | 245 #region IDisposable implementation |
| 227 | 246 |
| 247 /// <summary> | |
| 248 /// Releases all resource used by the <see cref="Implab.Components.RunnableComponent"/> object. | |
| 249 /// </summary> | |
| 250 /// <remarks> | |
| 251 /// <para>Will not try to stop the component, it will just release all resources. | |
| 252 /// To cleanup the component gracefully use <see cref="Stop()"/> method.</para> | |
| 253 /// <para> | |
| 254 /// In normal cases the <see cref="Dispose()"/> method shouldn't be called, the call to the <see cref="Stop()"/> | |
| 255 /// method is sufficient to cleanup the component. Call <see cref="Dispose()"/> only to cleanup after errors, | |
| 256 /// especially if <see cref="Stop"/> method is failed. Using this method insted of <see cref="Stop()"/> may | |
| 257 /// lead to the data loss by the component. | |
| 258 /// </para></remarks> | |
| 228 public void Dispose() { | 259 public void Dispose() { |
| 229 IPromise pending; | 260 IPromise pending; |
| 230 lock (m_stateMachine) { | 261 lock (m_stateMachine) { |
| 231 if (m_stateMachine.State == ExecutionState.Disposed) | 262 if (m_stateMachine.State == ExecutionState.Disposed) |
| 232 return; | 263 return; |
