using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using RevitHttpControl.Models; namespace RevitHttpControl.Services { /// /// 任务管理器 /// public class TaskManager { private static readonly Lazy _instance = new Lazy(() => new TaskManager()); /// /// 单例实例 /// public static TaskManager Instance => _instance.Value; /// /// 任务状态存储 /// private readonly ConcurrentDictionary _tasks; /// /// 上次清理时间 /// private DateTime _lastCleanupTime; /// /// 清理间隔(小时) /// private const int CLEANUP_INTERVAL_HOURS = 1; /// /// 私有构造函数 /// private TaskManager() { _tasks = new ConcurrentDictionary(); _lastCleanupTime = DateTime.UtcNow; } /// /// 创建新任务 /// /// 任务ID public Guid CreateTask(string executionId = null) { // 检查是否需要清理过期任务 CheckAndCleanupIfNeeded(); var taskId = Guid.NewGuid(); var effectiveExecutionId = string.IsNullOrWhiteSpace(executionId) ? taskId.ToString() : executionId; var task = new TaskStatusResponse { TaskId = taskId, Status = TaskStatus.Pending, CreatedAt = DateTime.UtcNow, ExecutionId = effectiveExecutionId }; _tasks.TryAdd(taskId, task); return taskId; } /// /// 检查并在需要时清理过期任务 /// private void CheckAndCleanupIfNeeded() { var now = DateTime.UtcNow; if (now.Subtract(_lastCleanupTime).TotalHours >= CLEANUP_INTERVAL_HOURS) { CleanupExpiredTasks(); _lastCleanupTime = now; } } /// /// 设置任务为运行状态 /// /// 任务ID public void SetTaskRunning(Guid taskId) { if (_tasks.TryGetValue(taskId, out var task)) { task.Status = TaskStatus.Running; } } /// /// 完成任务 /// /// 任务ID /// 任务结果 public void CompleteTask(Guid taskId, object result) { if (_tasks.TryGetValue(taskId, out var task)) { task.Status = TaskStatus.Completed; task.Result = result; task.CompletedAt = DateTime.UtcNow; NotifyTaskResultInBackground(task); } } /// /// 任务失败 /// /// 任务ID /// 错误消息 public void FailTask(Guid taskId, string errorMessage) { if (_tasks.TryGetValue(taskId, out var task)) { task.Status = TaskStatus.Failed; task.ErrorMessage = errorMessage; task.CompletedAt = DateTime.UtcNow; NotifyTaskResultInBackground(task); } } /// /// 后台触发任务结果回调,避免阻塞调用线程 /// /// 任务状态 private static void NotifyTaskResultInBackground(TaskStatusResponse task) { System.Threading.Tasks.Task.Run(() => { try { TaskCallbackService.NotifyTaskResult(task); } catch { // 回调失败不影响主流程 } }); } /// /// 取消任务 /// /// 任务ID public void CancelTask(Guid taskId) { if (_tasks.TryGetValue(taskId, out var task)) { task.Status = TaskStatus.Cancelled; task.CompletedAt = DateTime.UtcNow; } } /// /// 获取任务状态 /// /// 任务ID /// 任务状态响应 public TaskStatusResponse GetTaskStatus(Guid taskId) { _tasks.TryGetValue(taskId, out var task); return task; } /// /// 检查任务是否存在 /// /// 任务ID /// 是否存在 public bool TaskExists(Guid taskId) { return _tasks.ContainsKey(taskId); } /// /// 获取任务结果(仅用于向后兼容) /// /// 任务ID /// 任务结果 public object GetTaskResult(Guid taskId) { if (_tasks.TryGetValue(taskId, out var task) && task.Status == TaskStatus.Completed) { return task.Result; } return null; } /// /// 存储统计结果(用于向后兼容现有代码) /// /// 任务ID /// 统计数量 public void StoreStatsResult(Guid taskId, int count) { CompleteTask(taskId, count); } /// /// 获取统计结果(用于向后兼容现有代码) /// /// 任务ID /// 统计数量,如果不存在返回null public int? GetStatsResult(Guid taskId) { if (_tasks.TryGetValue(taskId, out var task) && task.Status == TaskStatus.Completed && task.Result is int count) { return count; } return null; } /// /// 清理过期任务(创建超过24小时的已完成任务) /// public void CleanupExpiredTasks() { var expiredTime = DateTime.UtcNow.AddHours(-24); var expiredTasks = new List(); foreach (var kvp in _tasks) { var task = kvp.Value; if ((task.Status == TaskStatus.Completed || task.Status == TaskStatus.Failed || task.Status == TaskStatus.Cancelled) && task.CreatedAt < expiredTime) { expiredTasks.Add(kvp.Key); } } foreach (var taskId in expiredTasks) { _tasks.TryRemove(taskId, out _); } } /// /// 获取任务总数 /// /// 任务总数 public int GetTaskCount() { return _tasks.Count; } /// /// 获取指定状态的任务数量 /// /// 任务状态 /// 任务数量 public int GetTaskCountByStatus(TaskStatus status) { return _tasks.Values.Count(t => t.Status == status); } } }