// <summary>
        /// Создает новый экземпляр ReadInputLoop и подписывает метод
        /// </summary>
        public static T Create <T, TU>(string id, Action <TU> action, bool startOnAwake = false)
            where T : LoopGeneric <TU>, new()
            where TU : class
        {
            // Новый экземпляр
            var loopT = new T();

            loopT.SetCancellationTokenSource(new CancellationTokenSource());

            // Подписываем переданный метод
            if (action != null)
            {
                loopT.Subscribe(action);
            }

            // Добавляем в менеджер
            LoopManager.AddLoop(loopT);

            LoopManager.Log($"Loop {loopT.Id}: ожидает старта");

            // Запускаем, если нужно
            if (startOnAwake)
            {
                loopT.Start();
            }

            return(loopT);
        }
Пример #2
0
        /// <summary>
        /// Запускает работу цикла в отдельную задачу
        /// </summary>
        public virtual void Start()
        {
            LoopManager.Log($"Loop {Id}: запущен");
            // Запускает новую задачу

            WorkspaceThread = new Thread(new ThreadStart(() => Update()));
            WorkspaceThread.Start();
        }
Пример #3
0
        /// <summary>
        /// // Устанавливает новый идентификатор
        /// </summary>
        public void SetId(string id)
        {
            if (Id != null || Id != String.Empty)
            {
                LoopManager.LogWarning($"Loop {Id}: был изменен идентификатор на {id}");
            }

            Id = id;
        }
Пример #4
0
        /// <summary>
        /// Устанавливает нового родителя токена отмены
        /// </summary>
        /// <param name="source"></param>
        public void SetCancellationTokenSource(CancellationTokenSource source)
        {
            if (source == null)
            {
                return;
            }

            if (CancellationTokenSource != null)
            {
                LoopManager.LogWarning($"Loop {Id} имеет токен, но будет заменен на новый");
            }

            CancellationTokenSource = source;
        }
Пример #5
0
        /// <summary>
        /// Проверяет запрос отмены. True если запрос действителен.
        /// </summary>
        protected bool CheckCancelationToken()
        {
            var token = CancellationTokenSource.Token;

            // Если запрошена отмена цикла - завершаем работу
            if (token.IsCancellationRequested == true)
            {
                // Очищаем данные
                Dispose();

                LoopStatus = LoopStatus.Canceled;

                LoopManager.Log($"Loop {Id}: остановлен");
                return(true);
            }

            return(false);
        }
Пример #6
0
 /// <summary>
 /// Вывод текущего статуса
 /// </summary>
 public void Report(LoopStatus value)
 {
     LoopManager.Log(value);
 }
Пример #7
0
        /// <summary>
        /// Останавливает цикл и связанный с ним Task
        /// </summary>
        public void Cancel()
        {
            CancellationTokenSource.Cancel();

            LoopManager.Log($"Loop {Id}: вызвана полная остановка");
        }