refactor: 重新调整后端工程结构
This commit is contained in:
103
server/src/Common/SemaphorePool.cs
Normal file
103
server/src/Common/SemaphorePool.cs
Normal file
@@ -0,0 +1,103 @@
|
||||
using System.Collections.Concurrent;
|
||||
|
||||
namespace Common;
|
||||
|
||||
/// <summary>
|
||||
/// [TODO:description]
|
||||
/// </summary>
|
||||
public class SemaphorePool
|
||||
{
|
||||
private SemaphoreSlim semaphore;
|
||||
private ConcurrentQueue<int> queue;
|
||||
private int beginNum;
|
||||
|
||||
/// <summary>
|
||||
/// [TODO:description]
|
||||
/// </summary>
|
||||
public int RemainingCount { get; }
|
||||
|
||||
/// <summary>
|
||||
/// [TODO:description]
|
||||
/// </summary>
|
||||
public int MaxCount { get; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// [TODO:description]
|
||||
/// </summary>
|
||||
/// <param name="initialCount">[TODO:parameter]</param>
|
||||
/// <param name="beginNum">[TODO:parameter]</param>
|
||||
/// <returns>[TODO:return]</returns>
|
||||
public SemaphorePool(int initialCount, int beginNum = 0)
|
||||
{
|
||||
semaphore = new SemaphoreSlim(initialCount);
|
||||
queue = new ConcurrentQueue<int>();
|
||||
this.beginNum = beginNum;
|
||||
this.RemainingCount = initialCount;
|
||||
this.MaxCount = initialCount;
|
||||
for (int i = 0; i < initialCount; i++)
|
||||
{
|
||||
queue.Enqueue(beginNum + i);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// [TODO:description]
|
||||
/// </summary>
|
||||
/// <param name="initialCount">[TODO:parameter]</param>
|
||||
/// <param name="maxCount">[TODO:parameter]</param>
|
||||
/// <param name="beginNum">[TODO:parameter]</param>
|
||||
/// <returns>[TODO:return]</returns>
|
||||
public SemaphorePool(int initialCount, int maxCount, int beginNum = 0)
|
||||
{
|
||||
semaphore = new SemaphoreSlim(initialCount, maxCount);
|
||||
queue = new ConcurrentQueue<int>();
|
||||
this.beginNum = beginNum;
|
||||
this.RemainingCount = initialCount;
|
||||
this.MaxCount = maxCount;
|
||||
for (int i = 0; i < initialCount; i++)
|
||||
{
|
||||
queue.Enqueue(beginNum + i);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// [TODO:description]
|
||||
/// </summary>
|
||||
/// <returns>[TODO:return]</returns>
|
||||
public void Wait()
|
||||
{
|
||||
WaitAsync().Wait();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// [TODO:description]
|
||||
/// </summary>
|
||||
/// <returns>[TODO:return]</returns>
|
||||
public Task WaitAsync()
|
||||
{
|
||||
var tcs = new TaskCompletionSource<bool>();
|
||||
queue.Enqueue(tcs);
|
||||
semaphore.WaitAsync().ContinueWith(t =>
|
||||
{
|
||||
TaskCompletionSource<bool> popped;
|
||||
if (queue.TryDequeue(out popped))
|
||||
popped.SetResult(true);
|
||||
});
|
||||
return tcs.Task;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// [TODO:description]
|
||||
/// </summary>
|
||||
/// <returns>[TODO:return]</returns>
|
||||
public void Release()
|
||||
{
|
||||
semaphore.Release();
|
||||
queue.Clear();
|
||||
for (int i = 0; i < MaxCount; i++)
|
||||
{
|
||||
queue.Enqueue(beginNum + i);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user