feat: added TaskCache class
This commit is contained in:
parent
cabd008204
commit
7919daa086
72
Plugin/Common/TaskCache.cs
Normal file
72
Plugin/Common/TaskCache.cs
Normal file
|
@ -0,0 +1,72 @@
|
|||
using System.Collections.Concurrent;
|
||||
|
||||
namespace LootValueEX.Common;
|
||||
|
||||
internal class TaskCache
|
||||
{
|
||||
private readonly SemaphoreSlim _semaphore;
|
||||
private readonly ConcurrentDictionary<Guid, Task> _taskDict;
|
||||
|
||||
internal TaskCache(int maxTasks = 10)
|
||||
{
|
||||
_semaphore = new SemaphoreSlim(maxTasks);
|
||||
_taskDict = new ConcurrentDictionary<Guid, Task>();
|
||||
}
|
||||
|
||||
private bool IsTaskCancelled(Guid taskGuid) =>
|
||||
_taskDict.TryGetValue(taskGuid, out Task task) && task.Status == TaskStatus.Canceled;
|
||||
|
||||
internal Guid AddTask(Func<CancellationToken, Task> taskFactory)
|
||||
{
|
||||
Guid taskGuid = Guid.NewGuid();
|
||||
CancellationTokenSource cts = new CancellationTokenSource();
|
||||
Task task = taskFactory(cts.Token);
|
||||
|
||||
_taskDict[taskGuid] = task;
|
||||
|
||||
return taskGuid;
|
||||
}
|
||||
|
||||
internal bool RemoveTask(Guid taskGuid)
|
||||
{
|
||||
if (_taskDict.TryGetValue(taskGuid, out Task task))
|
||||
{
|
||||
if (_taskDict.TryRemove(taskGuid, out _))
|
||||
{
|
||||
task.Dispose();
|
||||
_semaphore.Release();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
internal async Task<Task> RunTaskByGuidAsync(Guid taskGuid)
|
||||
{
|
||||
await _semaphore.WaitAsync();
|
||||
try
|
||||
{
|
||||
if ((_taskDict.TryGetValue(taskGuid, out Task task)))
|
||||
{
|
||||
if (!task.IsCompleted && !task.Status.Equals(TaskStatus.Running))
|
||||
await task;
|
||||
return task;
|
||||
}
|
||||
|
||||
Plugin.Log.LogError($"Task {taskGuid.ToString()} not found.");
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
RemoveTask(taskGuid);
|
||||
Plugin.Log.LogDebug($"Task {taskGuid.ToString()} got cancelled.");
|
||||
}
|
||||
return Task.FromResult(false);
|
||||
}
|
||||
|
||||
internal async Task<Task> AddAndRunTaskAsync(Func<CancellationToken, Task> taskFactory)
|
||||
{
|
||||
Guid taskGuid = AddTask(taskFactory);
|
||||
return await RunTaskByGuidAsync(taskGuid);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user