Example #1
0
        public OperationResult <long> ImportFiles(IFormFile file, long entityId)
        {
            if (!Semaphore.Wait(TimeSpan.FromSeconds(1)))
            {
                var message = $"Previous file import haven't finished yet. Failed to import File '{file.FileName}'";
                Log.Logger().Warning(message);
                return(OperationResult.Error(message).ToEmpty <long>());
            }

            try
            {
                var logIdResult = ImportService.CreateLog(file.FileName);

                if (logIdResult.Success)
                {
                    var stream = new MemoryStream();
                    file.CopyTo(stream);
                    stream.Position = 0;

                    Task.Factory.StartNew(() => Import(stream, file.FileName, entityId, logIdResult.Data), CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default)
                    .ContinueWith(t => LogTaskException(t.Exception, file.FileName), TaskContinuationOptions.OnlyOnFaulted)
                    .ContinueWith(t =>
                    {
                        Semaphore.Release(1);
                        stream?.Dispose();
                    });
                }

                return(logIdResult);
            }
            catch (Exception e)
            {
                var message = $"File '{file.FileName}' import failed. Message: {e.Message}";
                Log.Logger().Error(e, message);

                Semaphore.Release(1);

                return(OperationResult.Error(e, message).ToEmpty <long>());
            }
        }