view Implab/Components/IRunnable.cs @ 256:c52691faaf21 v3

Removed obsolete App, ComponentContainer Extracted IAsyncComponent interface Working on RunnableComponent
author cin
date Wed, 11 Apr 2018 03:05:14 +0300
parents 7c7e9ad6fe4a
children f1696cdc3d7a
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(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(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; }
    }
}