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);
}
}
}