using AmrControl.Common;
using AmrControl.JGR;
using System.Collections.Concurrent;
namespace AmrControl.services
{
public class TaskExecManager : ITaskExecManager
{
///
/// 任务列表
///
private ConcurrentQueue> tasks = new();
///
/// 进行中的任务
///
private volatile string? curTaskId;
///
/// 运行状态
///
private volatile bool _running;
///
/// 完成任务列表
///
private volatile List completedTasks = new();
///
/// 锁对象
///
Mutex mutex = new Mutex();
private static volatile TaskExecManager Instance = null;
public TaskExecManager()
{
Instance = this;
}
public static ITaskExecManager getInstance()
{
return Instance;
}
///
/// 添加任务
///
///
///
public void addTask(Proxy proxy, string taskId)
{
tasks.Enqueue(new Dictionary() { { taskId, proxy } });
}
///
/// 检查任务是否完成
///
///
///
public bool checkTaskIsCompleted(string taskId)
{
try
{
mutex.WaitOne();
return completedTasks.Remove(taskId);
}
finally
{
mutex.ReleaseMutex();
}
}
///
/// 生成任务id
///
///
public string genTaskId()
{
return Guid.NewGuid().ToString();
}
///
/// 通知任务完成
///
///
///
public void notifyTaskCompleted(string taskId)
{
try
{
mutex.WaitOne();
completedTasks.Add(taskId);
}
finally
{
mutex.ReleaseMutex();
}
}
public void start()
{
if (!_running)
{
_running = true;
startTask();
}
}
public void stop()
{
//修改运行状态标识
_running = false;
}
async void startTask()
{
while (_running)
{
Dictionary taskDic = null;
_ = tasks.TryDequeue(out taskDic);
if (taskDic != null)
{
try
{
curTaskId = taskDic.Keys.First();
//将当前任务id放入线程上下文
ThreadLocalManager.Set(new ThreadLocalContext() { taskId = curTaskId });
taskDic[curTaskId].Invoke();
////等待任务完成
//do
//{
// await Task.Delay(TimeSpan.FromMilliseconds(300));
//} while (!checkTaskIsCompleted(curTaskId));
} catch (Exception ex)
{
Console.WriteLine($"执行任务产生异常,异常原因:${ex.Message}");
}
//finally
//{
// ThreadLocalManager.Remove();
//}
}
else
{
await Task.Delay(TimeSpan.FromMilliseconds(300));
}
}
}
}
}