Mercurial > pub > ImplabNet
comparison Implab/Components/RunnableComponent.cs @ 208:7d07503621fe v2
RunnableComponent.Dispose(bool,Exception) changed to standart Dispose(bool)
IRunnable is now disposable
Code cleanups, suppressed some CodeAnalysis warnings
| author | cin |
|---|---|
| date | Sun, 13 Nov 2016 18:28:17 +0300 |
| parents | 8200ab154c8a |
| children | 5dc21f6a3222 |
comparison
equal
deleted
inserted
replaced
| 207:558f34b2fb50 | 208:7d07503621fe |
|---|---|
| 1 using System; | 1 using System; |
| 2 using System.Diagnostics.CodeAnalysis; | |
| 2 | 3 |
| 3 namespace Implab.Components { | 4 namespace Implab.Components { |
| 4 public abstract class RunnableComponent : IDisposable, IRunnable, IInitializable { | 5 public abstract class RunnableComponent : IDisposable, IRunnable, IInitializable { |
| 5 enum Commands { | 6 enum Commands { |
| 6 Ok = 0, | 7 Ok = 0, |
| 331 /// In normal cases the <see cref="Dispose()"/> method shouldn't be called, the call to the <see cref="Stop()"/> | 332 /// In normal cases the <see cref="Dispose()"/> method shouldn't be called, the call to the <see cref="Stop()"/> |
| 332 /// method is sufficient to cleanup the component. Call <see cref="Dispose()"/> only to cleanup after errors, | 333 /// method is sufficient to cleanup the component. Call <see cref="Dispose()"/> only to cleanup after errors, |
| 333 /// especially if <see cref="Stop"/> method is failed. Using this method insted of <see cref="Stop()"/> may | 334 /// especially if <see cref="Stop"/> method is failed. Using this method insted of <see cref="Stop()"/> may |
| 334 /// lead to the data loss by the component. | 335 /// lead to the data loss by the component. |
| 335 /// </para></remarks> | 336 /// </para></remarks> |
| 337 [SuppressMessage("Microsoft.Design", "CA1063:ImplementIDisposableCorrectly", Justification = "Dipose(bool) and GC.SuppessFinalize are called")] | |
| 336 public void Dispose() { | 338 public void Dispose() { |
| 337 IPromise pending; | 339 IPromise pending; |
| 338 | 340 |
| 339 lock (m_stateMachine) { | 341 lock (m_stateMachine) { |
| 340 if (m_stateMachine.State == ExecutionState.Disposed) | 342 if (m_stateMachine.State == ExecutionState.Disposed) |
| 341 return; | 343 return; |
| 342 pending = Move(Commands.Dispose, null, null); | 344 Move(Commands.Dispose, null, null); |
| 343 } | 345 } |
| 344 | 346 |
| 345 GC.SuppressFinalize(this); | 347 GC.SuppressFinalize(this); |
| 346 if (pending != null) { | 348 Dispose(true); |
| 347 pending.Cancel(); | |
| 348 pending.Timeout(DisposeTimeout).On( | |
| 349 () => Dispose(true, null), | |
| 350 err => Dispose(true, err), | |
| 351 reason => Dispose(true, new OperationCanceledException("The operation is cancelled", reason)) | |
| 352 ); | |
| 353 } else { | |
| 354 Dispose(true, null); | |
| 355 } | |
| 356 } | 349 } |
| 357 | 350 |
| 358 ~RunnableComponent() { | 351 ~RunnableComponent() { |
| 359 Dispose(false, null); | 352 Dispose(false); |
| 360 } | 353 } |
| 361 | 354 |
| 362 #endregion | 355 #endregion |
| 363 | 356 |
| 364 /// <summary> | 357 /// <summary> |
| 365 /// Releases all resources used by the component, called automatically, override this method to implement your cleanup. | 358 /// Releases all resources used by the component, called automatically, override this method to implement your cleanup. |
| 366 /// </summary> | 359 /// </summary> |
| 367 /// <param name="disposing">true if this method is called during normal dispose process.</param> | 360 /// <param name="disposing">true if this method is called during normal dispose process.</param> |
| 368 /// <param name="lastError">The last error which occured during the component stop.</param> | 361 /// <param name="pending">The operation which is currenty pending</param> |
| 369 protected virtual void Dispose(bool disposing, Exception lastError) { | 362 protected virtual void Dispose(bool disposing) { |
| 370 | 363 |
| 371 } | 364 } |
| 372 | 365 |
| 373 } | 366 } |
| 374 } | 367 } |
