C#简单串行任务队列内存泄漏

时间:2017-11-06 13:48:43

标签: c# multithreading async-await queue task

我需要一个非常基本的串行执行队列。 我基于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似乎没有收集任何东西。 谁能告诉我发生了什么?这与状态机有关吗

0 个答案:

没有答案