// <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); }
/// <summary> /// Запускает работу цикла в отдельную задачу /// </summary> public virtual void Start() { LoopManager.Log($"Loop {Id}: запущен"); // Запускает новую задачу WorkspaceThread = new Thread(new ThreadStart(() => Update())); WorkspaceThread.Start(); }
/// <summary> /// // Устанавливает новый идентификатор /// </summary> public void SetId(string id) { if (Id != null || Id != String.Empty) { LoopManager.LogWarning($"Loop {Id}: был изменен идентификатор на {id}"); } Id = id; }
/// <summary> /// Устанавливает нового родителя токена отмены /// </summary> /// <param name="source"></param> public void SetCancellationTokenSource(CancellationTokenSource source) { if (source == null) { return; } if (CancellationTokenSource != null) { LoopManager.LogWarning($"Loop {Id} имеет токен, но будет заменен на новый"); } CancellationTokenSource = source; }
/// <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); }
/// <summary> /// Вывод текущего статуса /// </summary> public void Report(LoopStatus value) { LoopManager.Log(value); }
/// <summary> /// Останавливает цикл и связанный с ним Task /// </summary> public void Cancel() { CancellationTokenSource.Cancel(); LoopManager.Log($"Loop {Id}: вызвана полная остановка"); }