view Implab/Components/IRunnable.cs @ 281:e0916ddc9950 v3 tip

code cleanup and refactoring
author cin
date Fri, 01 Jun 2018 21:35:24 +0300
parents f1696cdc3d7a
children
line wrap: on
line source

using System;
using System.Threading;
using System.Threading.Tasks;

namespace Implab.Components {
    /// <summary>
    /// Interface for the component which performs a long running task.
    /// </summary>
    /// <remarks>
    /// The access to the runnable component should be sequential, the
    /// componet should support asynchronous completion of the initiated
    /// operation but operations itself must be initiated sequentially.
    /// </remarks>
    public interface IRunnable {
        /// <summary>
        /// Starts this instance
        /// </summary>
        /// <remarks>
        /// This operation is cancellable and it's expected to move to
        /// the failed state or just ignore the cancellation request,
        /// </remarks>
        void Start();
        void Start(CancellationToken ct);

        /// <summary>
        /// Stops this instance and releases all resources, after the
        /// instance is stopped it is moved to Disposed state and
        /// can't be reused.
        /// </summary>
        /// <remarks>
        /// If the componet was in the starting state the pending operation
        /// will be requested to cancel. The stop operatin will be
        /// performed only if the component in the running state.
        /// </remarks>
        void Stop();
        void Stop(CancellationToken ct);
        
        /// <summary>
        /// Current state of the componenet, dynamically reflects the current state.
        /// </summary>
        ExecutionState State { get; }

        /// <summary>
        /// Event to monitor the state of the component.
        /// </summary>
        event EventHandler<StateChangeEventArgs> StateChanged;

        /// <summary>
        /// The last error
        /// </summary>
        Exception LastError { get; }
    }
}