/// <summary> /// Waits for the task instance status to change or timeout /// </summary> /// <param name="id"></param> /// <param name="process"></param> /// <param name="currentStatus"></param> /// <param name="timeout"></param> /// <returns></returns> private TaskInstanceStatues WaitForStatusChange(Guid id, Process process, TaskInstanceStatues currentStatus, TimeSpan timeout) { var timeNow = DateTime.UtcNow; var waitTimeout = timeNow.Add(timeout); TaskInstanceStatues newStatus = currentStatus; do { // Wait a bit before we check the status if (!process.HasExited) { Thread.Sleep(2000); } using var scope = _repositoryFactory.BeginRepositoryScope(); var taskInstanceRepository = scope.CreateRepository <ITaskInstanceRepository>(); TaskInstance taskInstance = taskInstanceRepository.Get(id); newStatus = taskInstance.Status; } while (currentStatus == newStatus && DateTime.UtcNow < waitTimeout && !process.HasExited); _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0, string.Format("WaitForStatusChange [TID: {0}] Waited for {1}", id, DateTime.UtcNow - timeNow))); return(newStatus); }
/// <summary> /// Waits for task instance to each completed status or timeout /// </summary> /// <param name="id"></param> /// <param name="timeout"></param> /// <returns></returns> private TaskInstanceStatues WaitForCompletion(Guid id, TimeSpan timeout) { DateTime timeoutEnd = DateTime.UtcNow.Add(timeout); TaskInstanceStatues status = TaskInstanceStatues.InProgress; do { using var scope = _repositoryFactory.BeginRepositoryScope(); var taskInstanceRepository = scope.CreateRepository <ITaskInstanceRepository>(); status = taskInstanceRepository.Get(id).Status; if (Array.IndexOf(new TaskInstanceStatues[] { TaskInstanceStatues.CompletedError, TaskInstanceStatues.CompletedSuccess }, status) == -1 && DateTime.UtcNow < timeoutEnd) { Thread.Sleep(2000); } else // Completed or timeout { break; } } while (true); return(status); }