using Hcs.WebApp.Data.Hcs; using System.Collections.Concurrent; namespace Hcs.WebApp.BackgroundServices { public class OperationExecutionState { private readonly ConcurrentQueue operationsInQueue = new(); private readonly HashSet operationsInProcess = []; public bool Ready { get; set; } public event Action OnOperationStarted; public event Action OnOperationExecuted; public event Action OnOperationEnded; public void EnqueueOperation(Operation operation) { operationsInQueue.Enqueue(operation); } public bool TryDequeueOperation(out Operation operation) { return operationsInQueue.TryDequeue(out operation); } public void SetProcessingOperation(Operation operation) { operationsInProcess.Add(operation); } public void UnsetProcessingOperation(Operation operation) { operationsInProcess.Remove(operation); } public bool HasCampaignOperation(int campaignId) { return operationsInQueue.Any(x => x.CampaignId == campaignId) || operationsInProcess.Any(x => x.CampaignId == campaignId); } public void InvokeOnOperationStarted(Operation operation) { try { OnOperationStarted?.Invoke(operation); } catch { } } public void InvokeOnOperationExecuted(Operation operation) { try { OnOperationExecuted?.Invoke(operation); } catch { } } public void InvokeOnOperationEnded(Operation operation) { try { OnOperationEnded?.Invoke(operation); } catch { } } } }