我需要一个非常基本的串行执行队列。 我基于this idea编写了以下内容,但是我需要一个队列来确保FIFO,所以我添加了一个中间ConcurrentQueue<>。
以下是代码:
public class SimpleSerialTaskQueue
{
private SemaphoreSlim _semaphore = new SemaphoreSlim(0);
private ConcurrentQueue<Func<Task>> _taskQueue = new ConcurrentQueue<Func<Task>>();
public SimpleSerialTaskQueue()
{
Task.Run(async () =>
{
Func<Task> dequeuedTask;
while (true)
{
if (await _semaphore.WaitAsync(1000))
{
if (_taskQueue.TryDequeue(out dequeuedTask) == true)
{
await dequeuedTask();
}
}
else
{
Console.WriteLine("Nothing more to process");
//If I don't do that , memory pressure is never released
//GC.Collect();
}
}
});
}
public void Add(Func<Task> o_task)
{
_taskQueue.Enqueue(o_task);
_semaphore.Release();
}
}
当我在循环中运行它,模拟重载时,我会遇到某种内存泄漏。这是代码:
static void Main(string[] args)
{
SimpleSerialTaskQueue queue = new SimpleSerialTaskQueue();
for (int i = 0; i < 100000000; i++)
{
queue.Add(async () =>
{
await Task.Delay(0);
});
}
Console.ReadLine();
}
编辑: 我不明白为什么一旦执行任务,我仍然会使用750MB的内存(基于VS2015诊断工具)。我以为一旦执行它会非常低。 GC似乎没有收集任何东西。 谁能告诉我发生了什么?这与状态机有关吗