public void Enqueue(FileOperationBase operation) { lock (((ICollection)_queue).SyncRoot) { _queue.Enqueue(operation); } Task.Run(() => RunOperation()); }
private async void RunOperation() { while (true) { FileOperationBase operation; lock (((ICollection)_queue).SyncRoot) { if (_currentOperation != null) { return; } if (_queue.Count == 0) { return; } operation = _queue.Dequeue(); if (operation.IsAborted) { continue; } _currentOperation = operation; } var success = await operation.Execute(); lock (((ICollection)_queue).SyncRoot) { _currentOperation = null; if (!operation.IsAborted) { if (!success) { if (operation.TryCount > 0) { _queue.Enqueue(operation); } } } } if (!success) { Thread.Sleep(500); continue; } OperationCompleted?.Invoke(this, new FileOperationEventArgs(operation)); operation.Dispose(); } }
private void _queue(FileOperationBase operation) { operation.ScheduledTime = DateTime.UtcNow; operation.OperationStatus = FileOperationStatus.Waiting; Logger.Info("Operation scheduled: {0}", operation); switch (operation) { case IngestOperation _: _queueConvertOperation.Enqueue(operation); break; case ExportOperation _: _queueExportOperation.Enqueue(operation); break; case CopyOperation _: case DeleteOperation _: case LoudnessOperation _: case MoveOperation _: _queueSimpleOperation.Enqueue(operation); break; } OperationAdded?.Invoke(this, new FileOperationEventArgs(operation)); }
public void FileNameProvided_ConsoleReaderReturned() { FileOperationBase result = (FileOperationBase)parser.Parse("/console"); Assert.IsType <CommandLineReader>(result.Parent); }