Пример #1
0
        private async void StartWriteTask(Guid actuatorId, Task <Command> command)
        {
            var result = await command;

            if (result.Value.ExecuteDate <= DateTime.Now)
            {
                Console.WriteLine("ExecuteDate passed: " + result.Value.ExecuteDate);
                Console.WriteLine("Now: " + DateTime.Now);
                return;
            }

            var actuator = await _actuatorRepo.Get(actuatorId);

            var writeSource = new CancellationTokenSource();

            _serialCancellation.AddSource(result.Id, writeSource);

            //fire and forget, will confirm in database upon completion
            _ = Task.Run(async() =>
            {
                Console.WriteLine("Run Task");
                Command written;
                using (var scope = _serviceScopeFactory.CreateScope())
                {
                    var serialWrite = scope.ServiceProvider.GetRequiredService <ISerialWrite>();
                    written         = await serialWrite.Write(actuator, result, writeSource);
                }

                return(written);
            },
                         writeSource.Token).ContinueWith(async task =>
            {
                var newResult = await task;
                if (newResult == null)
                {
                    return;
                }
                if (newResult.Value.Repeat == TimeSpan.Zero)
                {
                    _serialCancellation.RemoveSource(newResult.Id);
                }
                else
                {
                    Console.WriteLine("old: " + newResult.Value.ExecuteDate);
                    Console.WriteLine("repeat: " + newResult.Value.Repeat);
                    var newTime = newResult.Value.ExecuteDate + newResult.Value.Repeat;
                    Console.WriteLine("new: " + newTime);
                    newResult.Value.ExecuteDate += newResult.Value.Repeat;
                    using (var scope = _serviceScopeFactory.CreateScope())
                    {
                        var service = scope.ServiceProvider.GetRequiredService <ICommandService>();
                        _           = service.Update(newResult.Id, actuatorId, newResult.Value);
                    }
                    Console.WriteLine("Repeated");
                }
            });
        }
Пример #2
0
 public IActionResult Get(int id)
 {
     return(Ok(repo.Get(id)));
 }
 public Task <Actuator> GetById(Guid id)
 {
     return(_repo.Get(id));
 }