コード例 #1
0
 public void Init(string description, string reference, bool isLongRunning)
 {
     _taskInfo = new LiteTaskInfo(description, reference, isLongRunning)
     {
         ctsPerTask = new CancellationTokenSource()
     };
 }
コード例 #2
0
        private async Task AddTask(LiteTaskInfo liteTask)
        {
            try
            {
                bool success = await taskLock.WaitAsync(60000, cts.Token).ConfigureAwait(false);

                tasks.Add(liteTask);
            }
            catch (TaskCanceledException e)
            {
                _logger.Log(LogLevel.Information, $"{e.Message}");
            }
            catch (Exception e)
            {
                _logger.LogFullException(e);
            }
            finally
            {
                try
                {
                    if (taskLock.CurrentCount == 0)
                    {
                        taskLock.Release();
                    }
                }
                catch (Exception) { }
            }
        }
コード例 #3
0
        private async Task CheckLongRunningTaskItem(LITETask liteTask, LiteTaskInfo task)
        {
            Throw.IfNull(liteTask);
            Throw.IfNull(task);

            if (task.task == null)
            {
                return;
            }

            TaskStatus status = task.task.Status;

            switch (status)
            {
            case TaskStatus.Canceled:
            case TaskStatus.Faulted:
            case TaskStatus.RanToCompletion:
            {
                task.MarkTaskComplete();          //this is in case taskCompletion didn't fire
                await liteTask.RemoveTask(task);

                break;
            }
            }

            _logger.Log(LogLevel.Information, $" ->task: {task.taskID} {((task.task.Status.Equals(TaskStatus.WaitingForActivation)) ? "Running" : task.task.Status.ToString())} elapsed: {((task.completionDate == null) ? (DateTime.Now - task.bornOnDate) : (task.completionDate - task.bornOnDate))} {task.reference} {task.description}");
        }
コード例 #4
0
        public async Task TaskCompletion(Profile profile)
        {
            var taskInfo = "";

            try
            {
                while (true)
                {
                    Task[]       arrayOfTasks = null;
                    LiteTaskInfo task         = null;
                    arrayOfTasks = await GetShortRunningAsyncTasks().ConfigureAwait(false);

                    if (arrayOfTasks != null && arrayOfTasks.Length > 0)
                    {
                        var completedTask = await Task.WhenAny(arrayOfTasks);

                        if (completedTask != null)
                        {
                            try
                            {
                                task = (await GetLITETasks().ConfigureAwait(false)).Find(e => e.task == completedTask);
                            }
                            catch (Exception e)
                            {
                                _logger.LogFullException(e, taskInfo);
                            }
                        }

                        if (task != null && task.task != null)
                        {
                            task.MarkTaskComplete();
                            _logger.Log(LogLevel.Information, $"{taskInfo} task: {task?.taskID} {((task.task.Status.Equals(TaskStatus.WaitingForActivation)) ? "Running" : task.task.Status.ToString())} elapsed: {((task.completionDate == null) ? (DateTime.Now - task.bornOnDate) : (task.completionDate - task.bornOnDate))} {task.reference} {task.description}");
                            await RemoveTask(task);
                        }
                    }
                    else
                    {
                        //var profile = _profileStorage.Current;
                        await Task.Delay(profile.taskDelay, LITETask._cts.Token).ConfigureAwait(false);
                    }
                }
            }
            catch (TaskCanceledException)
            {
                _logger.Log(LogLevel.Information, $"Task was canceled.");
            }
            catch (Exception e)
            {
                _logger.LogFullException(e, taskInfo);
            }
            finally
            {
                Stop($"TaskCompletion");
            }
        }
コード例 #5
0
        public override bool Equals(object obj)
        {
            // All we are checking here is the reference field
            if (obj == null || GetType() != obj.GetType())
            {
                return(false);
            }

            LiteTaskInfo d = (LiteTaskInfo)obj;

            return(_taskInfo.reference == d.reference);
        }
コード例 #6
0
        public LiteTaskInfo Create(string description, string reference, bool isLongRunning)
        {
            LiteTaskInfo task = new LiteTaskInfo(description, reference, isLongRunning);

            try
            {
                AddTask(task).Wait();
            }
            catch (Exception e)
            {
                _logger.LogFullException(e);
            }
            return(task);
        }
コード例 #7
0
        public void CreateAndRun(int taskID, Task task, string type, string description, string reference, bool isLongRunning)
        {
            try
            {
                _taskInfo = new LiteTaskInfo(taskID, task, type, description, reference, isLongRunning)
                {
                    ct         = cts.Token,
                    ctsPerTask = new CancellationTokenSource()
                };

                AddTask(_taskInfo).Wait();
            }
            catch (Exception e)
            {
                _logger.LogCritical(e, "Could not create and run task");
            }
        }
コード例 #8
0
        public void CreateAndRun(Action action, string description, string reference, bool isLongRunning)
        {
            try
            {
                _taskInfo = new LiteTaskInfo(action, description, reference, isLongRunning)
                {
                    ctsPerTask = new CancellationTokenSource()
                };

                _taskInfo.ct = _taskInfo.ctsPerTask.Token;
                AddTask(_taskInfo).Wait();

                _taskInfo.task = Task.Factory.StartNew(action, _taskInfo.ct, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
            }
            catch (Exception e)
            {
                _logger.LogCritical(e, "CreateAndRun failed");
            }
        }
コード例 #9
0
        internal async Task RemoveTask(LiteTaskInfo liteTask)
        {
            _logger.Log(LogLevel.Debug, $"Removing task: {liteTask.taskID} reference: {liteTask.reference} description: {liteTask.description}");

            try
            {
                bool success = await taskLock.WaitAsync(60000, cts.Token).ConfigureAwait(false);
            }
            catch (Exception e)
            {
                _logger.LogFullException(e);
            }
            finally
            {
                try
                {
                    if (taskLock.CurrentCount == 0)
                    {
                        taskLock.Release();
                    }
                }
                catch (Exception) { }
            }

            try
            {
                var result = tasks.Remove(liteTask);
                // if (!result)
                // {
                //     if (Logger.logger.FileTraceLevel == "Verbose") _logger.Log(LogLevel.Verbose, $"Unable to remove task: {liteTask.taskID} reference: {liteTask.reference} description: {liteTask.description}");
                // }
            }
            catch (Exception e)
            {
                _logger.LogFullException(e);
            }
            finally
            {
            }
        }
コード例 #10
0
 public void Init(string reference, bool isLongRunning)
 {
     _taskInfo = new LiteTaskInfo(reference, isLongRunning);
 }
コード例 #11
0
 public int NewTaskID()
 {
     return(LiteTaskInfo.NewTaskID());
 }
コード例 #12
0
        private async Task ProcessTempTaskItem(LITETask liteTask, LiteTaskInfo task)
        {
            if (task.task == null)
            {
                return;
            }

            //Report status on short running tasks
            if (task.isLongRunning) //long running tasks that manage mini-tasks
            {
                return;
            }

            switch (task.task.Status)
            {
            case TaskStatus.WaitingForActivation:

            case TaskStatus.Created:

                if (DateTime.Now.Second % 10 == 0)
                {
                    _logger.Log(LogLevel.Information, $"task: {task.taskID} {((task.task.Status.Equals(TaskStatus.WaitingForActivation)) ? "Running" : task.task.Status.ToString())} elapsed: {((task.completionDate == null) ? (DateTime.Now - task.bornOnDate) : (task.completionDate - task.bornOnDate))} {task.reference} {task.description}");
                }

                break;

            case TaskStatus.Running:

            case TaskStatus.WaitingForChildrenToComplete:

            case TaskStatus.WaitingToRun:

                if (DateTime.Now.Second % 10 == 0)
                {
                    _logger.Log(LogLevel.Information, $"task: {task.taskID} {((task.task.Status.Equals(TaskStatus.WaitingForActivation)) ? "Running" : task.task.Status.ToString())} elapsed: {((task.completionDate == null) ? (DateTime.Now - task.bornOnDate) : (task.completionDate - task.bornOnDate))} {task.reference} {task.description}");
                }

                break;

            case TaskStatus.Canceled:

            case TaskStatus.Faulted:

            case TaskStatus.RanToCompletion:

                task.MarkTaskComplete();      //this is in case taskCompletion didn't fire

                await liteTask.RemoveTask(task);

                _logger.Log(LogLevel.Information, $"task: {task.taskID} {((task.task.Status.Equals(TaskStatus.WaitingForActivation)) ? "Running" : task.task.Status.ToString())} elapsed: {((task.completionDate == null) ? (DateTime.Now - task.bornOnDate) : (task.completionDate - task.bornOnDate))} {task.reference} {task.description}");

                break;
            }

            var profile = _profileStorage.Current;

            if (DateTime.Now - task.bornOnDate > profile.maxTaskDuration)
            {
                _logger.Log(LogLevel.Information, $"task: {task.taskID} {((task.task.Status.Equals(TaskStatus.WaitingForActivation)) ? "Running" : task.task.Status.ToString())} elapsed: {((task.completionDate == null) ? (DateTime.Now - task.bornOnDate) : (task.completionDate - task.bornOnDate))} {task.reference} {task.description} RUNNING LONGER THAN profile.maxTaskDuration.");
                task.ctsPerTask.Cancel();
            }
        }