using System;
using System.Threading.Tasks;
namespace Implab.Components {
///
/// An interface for asynchronous components.
///
///
///
/// Асинхронные компоненты не предназначены для одновременного использования несколькими клиентами,
/// однако существуют внутренние процессы, изменяющее состояние компонент без участия клиента.
/// Данный интерфейс определяет протокол взаимодействия с компонентой, при которм компоненте
/// посылаются сигналы от клиента, в ответ на которые компонента меняет свойство ,
/// данное свойство содержит в себе новую задачу, выполняемую компонентой и данное свойство
/// может измениться только при получении нового сигнала от клиента.
///
///
/// В дополнение к компонента может определять другие свойства, в
/// которых будет передаваться информация о результате выполнения операции.
///
///
/// Особое внимание следует уделить реализации , который по своей природе
/// синхронный, данное правило безусловно можно нарушить, но тогда могут возникнуть проблемы с
/// тем, что ресурсы еще не освободились, а ход программы продолжается, что приведет к ошибкам,
/// например при попытке получить ресуср другим объектом, либо при заврешении программы.
///
///
///
public interface IAsyncComponent {
///
/// The result of the last started operation. This property reflects
/// only the result of the last started operation and therefore should
/// change only if a new operation is initiated.
///
Task Completion { get; }
}
}