using System.Collections.Concurrent; namespace MesETL.App.Services; /// /// 处理上下文类,标识处理进度 /// public class ProcessContext { private bool _hasException; private long _inputCount; private long _transformCount; private long _outputCount; private readonly ConcurrentDictionary _tableProgress = new(); public bool HasException => _hasException; public bool IsInputCompleted { get; private set; } public bool IsTransformCompleted { get; private set; } public bool IsOutputCompleted { get; private set; } public long InputCount { get => _inputCount; set => Interlocked.Exchange(ref _inputCount, value); } public long TransformCount { get => _transformCount; set => Interlocked.Exchange(ref _transformCount, value); } public long OutputCount { get => _outputCount; set => Interlocked.Exchange(ref _outputCount, value); } // TableName -> Count public IReadOnlyDictionary TableProgress => _tableProgress; public void CompleteInput() => IsInputCompleted = true; public void CompleteTransform() => IsTransformCompleted = true; public void CompleteOutput() => IsOutputCompleted = true; public bool AddException(Exception e) => _hasException = true; public void AddInput() => Interlocked.Increment(ref _inputCount); public void AddInput(int count) => Interlocked.Add(ref _inputCount, count); public void AddTransform() => Interlocked.Increment(ref _transformCount); public void AddTransform(int count) => Interlocked.Add(ref _transformCount, count); public void AddOutput() => Interlocked.Increment(ref _outputCount); public void AddOutput(int count) => Interlocked.Add(ref _outputCount, count); public void AddTableOutput(string table, int count) { _tableProgress.AddOrUpdate(table, count, (k, v) => v + count); AddOutput(count); } public long GetTableOutput(string table) { if(!_tableProgress.TryGetValue(table, out var count)) throw new ApplicationException($"未找到表{table}输出记录"); return count; } }